Device Setting - CPU and GPU in PyTorch

Device Setting - CPU and GPU in PyTorch#

import os

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = '0'

import time
import numpy as np

import meent
# experiment options
pol = 0  # 0: TE, 1: TM

n_top = 1  # n_topncidence
n_bot = 1  # n_transmission

theta = 20 * np.pi / 180
phi = 50 * np.pi / 180

wavelength = 900

thickness = [500]
period = [1000, 1000]

fto = [15, 15]
res_x, res_y, res_z = 20, 20, 20

ucell = np.array([
            [
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, ],
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, ],
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, ],
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, ],
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, ],
                [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, ],
                [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, ],
                [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, ],
                [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, ],
                [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, ],
            ],
        ]) * 4 + 1

set device#

  1. at initialization

backend = 2  # TorchMeent
device = 0 # CPU;
dtype = 0
mee = meent.call_mee(backend=backend, pol=pol, n_top=n_top, n_bot=n_bot, theta=theta, phi=phi,
                     fto=fto, wavelength=wavelength, period=period, ucell=ucell,
                     thickness=thickness, device=device, type_complex=dtype)

    
  1. after initialization

backend = 2  # TorchMeent

mee = meent.call_mee(backend=backend, pol=pol, n_top=n_top, n_bot=n_bot, theta=theta, phi=phi,
                     fto=fto, wavelength=wavelength, period=period, ucell=ucell,
                     thickness=thickness, type_complex=dtype)
mee.device = 0

PyTorch#

CPU, 64 bit#

backend = 2  # TorchMeent
device = 0 # CPU;
dtype = 0
mee = meent.call_mee(backend=backend, pol=pol, n_top=n_top, n_bot=n_bot, theta=theta, phi=phi,
                     fto=fto, wavelength=wavelength, period=period, ucell=ucell,
                     thickness=thickness, device=device, type_complex=dtype)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 2nd: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 1st: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 2nd: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 2nd: ', time.time() - t0)
/home/yongha/meent/meent/on_torch/emsolver/convolution_matrix.py:262: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
  n = torch.tensor(n, device=device)
/home/yongha/meent/meent/on_torch/emsolver/convolution_matrix.py:266: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
  n = torch.tensor(n, device=device)
/home/yongha/meent/meent/on_torch/emsolver/convolution_matrix.py:272: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
  center = torch.tensor(center, device=device)
time for efficiency, 1st:  10.62068796157837
time for efficiency, 2nd:  11.160445928573608
time for field, 1st:  2.2909114360809326
time for field, 2nd:  2.246786117553711
time for efficiency and field in one step, 1st:  11.363512992858887
time for efficiency and field in one step, 2nd:  13.186446905136108

GPU, 64 bit#

backend = 2  # TorchMeent
device = 1 # GPU;
dtype = 0
mee = meent.call_mee(backend=backend, pol=pol, n_top=n_top, n_bot=n_bot, theta=theta, phi=phi,
                     fto=fto, wavelength=wavelength, period=period, ucell=ucell,
                     thickness=thickness, device=device, type_complex=dtype)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 2nd: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 1st: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 2nd: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 2nd: ', time.time() - t0)
time for efficiency, 1st:  11.453850507736206
time for efficiency, 2nd:  10.205169916152954
time for field, 1st:  0.2730429172515869
time for field, 2nd:  0.37608838081359863
time for efficiency and field in one step, 1st:  10.453550815582275
time for efficiency and field in one step, 2nd:  10.50816559791565

CPU, 32 bit#

backend = 2  # TorchMeent
device = 0  # CPU;
dtype = 1  # 32bit
mee = meent.call_mee(backend=backend, pol=pol, n_top=n_top, n_bot=n_bot, theta=theta, phi=phi,
                     fto=fto, wavelength=wavelength, period=period, ucell=ucell,
                     thickness=thickness, device=device, type_complex=dtype)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 2nd: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 1st: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 2nd: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 2nd: ', time.time() - t0)
time for efficiency, 1st:  12.741153955459595
time for efficiency, 2nd:  12.88903021812439
time for field, 1st:  0.3924534320831299
time for field, 2nd:  0.43109703063964844
time for efficiency and field in one step, 1st:  14.301433086395264
time for efficiency and field in one step, 2nd:  13.814810276031494

GPU, 32 bit#

backend = 2  # TorchMeent
device = 1  # CPU;
dtype = 1  # 32bit
mee = meent.call_mee(backend=backend, pol=pol, n_top=n_top, n_bot=n_bot, theta=theta, phi=phi,
                     fto=fto, wavelength=wavelength, period=period, ucell=ucell,
                     thickness=thickness, device=device, type_complex=dtype)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti = mee.conv_solve()
print(f'time for efficiency, 2nd: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 1st: ', time.time() - t0)

t0 = time.time()
field_cell = mee.calculate_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for field, 2nd: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 1st: ', time.time() - t0)

t0 = time.time()
de_ri, de_ti, field_cell = mee.conv_solve_field(res_x=res_x, res_y=res_y, res_z=res_z)
print(f'time for efficiency and field in one step, 2nd: ', time.time() - t0)
time for efficiency, 1st:  3.8784255981445312
time for efficiency, 2nd:  4.061480283737183
time for field, 1st:  0.03484749794006348
time for field, 2nd:  0.03699755668640137
time for efficiency and field in one step, 1st:  3.9686903953552246
time for efficiency and field in one step, 2nd:  3.844003438949585