在 Numba 中使用 CPU 和 GPU 并行化实现 class 的最 "elegant" 方法是什么?
What is the most "elegant" way to implement a class with both CPU and GPU parallelizations in Numba?
让我们假设我已经使用 Numba 实现了相同 class 的两个不同版本:
class cpu_foo(object):
def init(self, data):
# initialize the class...
def compute(self, parameters):
call_to_parallel_cpu_function(parameters)
class gpu_foo(object):
def init(self, data):
# initialize the class...
# ...with some fine tunings for the gpu computation
def compute(self, parameters):
call_to_parallel_cuda_function(parameters)
然后,根据我正在使用的机器,我调用一个版本或另一个版本。
我知道拥有相同代码的 2 个不同版本是一种可怕的做法,但我不确定什么是最 "standard" 实现 class 能力的方法:
- 检测是否有支持 CUDA 的设备
- 如果是,初始化为gpu class
- 如果不是,初始化为cpuclass
总的来说,我找不到关于该主题的任何语言的任何设计指示...我是否遗漏了什么?
我认为您的问题与设计更相关。
一个可能的设计可能是:
class Gen(object):
def __init__(self):
pass
def compute(self, parameters):
# call_to_parallel_cpu_function(parameters)
pass
@staticmethod
def generate_instance(_data):
# code to detect if there is a cuda capable device
# and return true/false and store it in cuda_device variable
cuda_device = True
if cuda_device:
return GpuFoo(_data)
else:
return CpuFoo(_data)
class CpuFoo(Gen):
def __init__(self, data):
super(CpuFoo, self).__init__()
self.data = data
def compute(self, parameters):
# call_to_parallel_cpu_function(parameters)
pass
class GpuFoo(Gen):
def __init__(self, data):
super(GpuFoo, self).__init__()
self.data = data
def compute(self, parameters):
# call_to_parallel_cuda_function(parameters)
pass
Gen.generate_instance([1]).compute([2]) # an example of how to use
Gen
是一个基础class,它有一个静态方法generate_instance
,它根据设备的能力生成所需的实例。 CpuFoo
和 GpuFoo
是两个子 classes 并且继承基础 class Gen
并给出自己的 compute
方法实现。
如果有帮助请告诉我!!
P.S.. Gen.generate_instance([1])
检测设备是否支持 CUDA,如果是,return GpuFoo
class else return 是 CpuFoo
.
的实例
让我们假设我已经使用 Numba 实现了相同 class 的两个不同版本:
class cpu_foo(object):
def init(self, data):
# initialize the class...
def compute(self, parameters):
call_to_parallel_cpu_function(parameters)
class gpu_foo(object):
def init(self, data):
# initialize the class...
# ...with some fine tunings for the gpu computation
def compute(self, parameters):
call_to_parallel_cuda_function(parameters)
然后,根据我正在使用的机器,我调用一个版本或另一个版本。
我知道拥有相同代码的 2 个不同版本是一种可怕的做法,但我不确定什么是最 "standard" 实现 class 能力的方法:
- 检测是否有支持 CUDA 的设备
- 如果是,初始化为gpu class
- 如果不是,初始化为cpuclass
总的来说,我找不到关于该主题的任何语言的任何设计指示...我是否遗漏了什么?
我认为您的问题与设计更相关。 一个可能的设计可能是:
class Gen(object):
def __init__(self):
pass
def compute(self, parameters):
# call_to_parallel_cpu_function(parameters)
pass
@staticmethod
def generate_instance(_data):
# code to detect if there is a cuda capable device
# and return true/false and store it in cuda_device variable
cuda_device = True
if cuda_device:
return GpuFoo(_data)
else:
return CpuFoo(_data)
class CpuFoo(Gen):
def __init__(self, data):
super(CpuFoo, self).__init__()
self.data = data
def compute(self, parameters):
# call_to_parallel_cpu_function(parameters)
pass
class GpuFoo(Gen):
def __init__(self, data):
super(GpuFoo, self).__init__()
self.data = data
def compute(self, parameters):
# call_to_parallel_cuda_function(parameters)
pass
Gen.generate_instance([1]).compute([2]) # an example of how to use
Gen
是一个基础class,它有一个静态方法generate_instance
,它根据设备的能力生成所需的实例。 CpuFoo
和 GpuFoo
是两个子 classes 并且继承基础 class Gen
并给出自己的 compute
方法实现。
如果有帮助请告诉我!!
P.S.. Gen.generate_instance([1])
检测设备是否支持 CUDA,如果是,return GpuFoo
class else return 是 CpuFoo
.