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#
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)
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