Moved some methods to OpenCL grid class

这个提交包含在:
Craig Warren
2024-01-29 13:51:47 +00:00
父节点 15c5d36054
当前提交 489b66f397

查看文件

@@ -18,6 +18,7 @@
import decimal as d import decimal as d
from collections import OrderedDict from collections import OrderedDict
from importlib import import_module
import numpy as np import numpy as np
@@ -309,6 +310,8 @@ class CUDAGrid(FDTDGrid):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.gpuarray = import_module("pycuda.gpuarray")
# Threads per block - used for main electric/magnetic field updates # Threads per block - used for main electric/magnetic field updates
self.tpb = (128, 1, 1) self.tpb = (128, 1, 1)
# Blocks per grid - used for main electric/magnetic field updates # Blocks per grid - used for main electric/magnetic field updates
@@ -321,81 +324,73 @@ class CUDAGrid(FDTDGrid):
self.bpg = (int(np.ceil(((self.nx + 1) * (self.ny + 1) * (self.nz + 1)) / self.tpb[0])), 1, 1) self.bpg = (int(np.ceil(((self.nx + 1) * (self.ny + 1) * (self.nz + 1)) / self.tpb[0])), 1, 1)
def htod_geometry_arrays(self, queue=None): def htod_geometry_arrays(self):
"""Initialise an array for cell edge IDs (ID) on compute device."""
self.ID_dev = self.gpuarray.to_gpu(self.ID)
def htod_field_arrays(self):
"""Initialise field arrays on compute device."""
self.Ex_dev = self.gpuarray.to_gpu(self.Ex)
self.Ey_dev = self.gpuarray.to_gpu(self.Ey)
self.Ez_dev = self.gpuarray.to_gpu(self.Ez)
self.Hx_dev = self.gpuarray.to_gpu(self.Hx)
self.Hy_dev = self.gpuarray.to_gpu(self.Hy)
self.Hz_dev = self.gpuarray.to_gpu(self.Hz)
def htod_dispersive_arrays(self):
"""Initialise dispersive material coefficient arrays on compute device."""
self.updatecoeffsdispersive_dev = self.gpuarray.to_gpu(self.updatecoeffsdispersive)
self.Tx_dev = self.gpuarray.to_gpu(self.Tx)
self.Ty_dev = self.gpuarray.to_gpu(self.Ty)
self.Tz_dev = self.gpuarray.to_gpu(self.Tz)
class OpenCLGrid(FDTDGrid):
"""Additional grid methods for solving on compute device using OpenCL."""
def __init__(self):
super().__init__()
self.clarray = import_module("pyopencl.array")
def htod_geometry_arrays(self, queue):
"""Initialise an array for cell edge IDs (ID) on compute device. """Initialise an array for cell edge IDs (ID) on compute device.
Args: Args:
queue: pyopencl queue. queue: pyopencl queue.
""" """
if config.sim_config.general["solver"] == "cuda": self.ID_dev = self.clarray.to_device(queue, self.ID)
import pycuda.gpuarray as gpuarray
self.ID_dev = gpuarray.to_gpu(self.ID) def htod_field_arrays(self, queue):
elif config.sim_config.general["solver"] == "opencl":
import pyopencl.array as clarray
self.ID_dev = clarray.to_device(queue, self.ID)
def htod_field_arrays(self, queue=None):
"""Initialise field arrays on compute device. """Initialise field arrays on compute device.
Args: Args:
queue: pyopencl queue. queue: pyopencl queue.
""" """
if config.sim_config.general["solver"] == "cuda": self.Ex_dev = self.clarray.to_device(queue, self.Ex)
import pycuda.gpuarray as gpuarray self.Ey_dev = self.clarray.to_device(queue, self.Ey)
self.Ez_dev = self.clarray.to_device(queue, self.Ez)
self.Hx_dev = self.clarray.to_device(queue, self.Hx)
self.Hy_dev = self.clarray.to_device(queue, self.Hy)
self.Hz_dev = self.clarray.to_device(queue, self.Hz)
self.Ex_dev = gpuarray.to_gpu(self.Ex) def htod_dispersive_arrays(self, queue):
self.Ey_dev = gpuarray.to_gpu(self.Ey)
self.Ez_dev = gpuarray.to_gpu(self.Ez)
self.Hx_dev = gpuarray.to_gpu(self.Hx)
self.Hy_dev = gpuarray.to_gpu(self.Hy)
self.Hz_dev = gpuarray.to_gpu(self.Hz)
elif config.sim_config.general["solver"] == "opencl":
import pyopencl.array as clarray
self.Ex_dev = clarray.to_device(queue, self.Ex)
self.Ey_dev = clarray.to_device(queue, self.Ey)
self.Ez_dev = clarray.to_device(queue, self.Ez)
self.Hx_dev = clarray.to_device(queue, self.Hx)
self.Hy_dev = clarray.to_device(queue, self.Hy)
self.Hz_dev = clarray.to_device(queue, self.Hz)
def htod_dispersive_arrays(self, queue=None):
"""Initialise dispersive material coefficient arrays on compute device. """Initialise dispersive material coefficient arrays on compute device.
Args: Args:
queue: pyopencl queue. queue: pyopencl queue.
""" """
if config.sim_config.general["solver"] == "cuda": self.updatecoeffsdispersive_dev = self.clarray.to_device(queue, self.updatecoeffsdispersive)
import pycuda.gpuarray as gpuarray # self.updatecoeffsdispersive_dev = self.clarray.to_device(queue, np.ones((95,95,95), dtype=np.float32))
self.Tx_dev = self.clarray.to_device(queue, self.Tx)
self.Tx_dev = gpuarray.to_gpu(self.Tx) self.Ty_dev = self.clarray.to_device(queue, self.Ty)
self.Ty_dev = gpuarray.to_gpu(self.Ty) self.Tz_dev = self.clarray.to_device(queue, self.Tz)
self.Tz_dev = gpuarray.to_gpu(self.Tz)
self.updatecoeffsdispersive_dev = gpuarray.to_gpu(self.updatecoeffsdispersive)
elif config.sim_config.general["solver"] == "opencl":
import pyopencl.array as clarray
self.Tx_dev = clarray.to_device(queue, self.Tx)
self.Ty_dev = clarray.to_device(queue, self.Ty)
self.Tz_dev = clarray.to_device(queue, self.Tz)
self.updatecoeffsdispersive_dev = clarray.to_device(queue, self.updatecoeffsdispersive)
class OpenCLGrid(CUDAGrid):
"""Additional grid methods for solving on compute device using OpenCL."""
def __init__(self):
super().__init__()
def set_blocks_per_grid(self):
pass
def dispersion_analysis(G): def dispersion_analysis(G):