在 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 能力的方法:

总的来说,我找不到关于该主题的任何语言的任何设计指示...我是否遗漏了什么?

我认为您的问题与设计更相关。 一个可能的设计可能是:

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,它根据设备的能力生成所需的实例。 CpuFooGpuFoo 是两个子 classes 并且继承基础 class Gen 并给出自己的 compute 方法实现。

如果有帮助请告诉我!!

P.S.. Gen.generate_instance([1]) 检测设备是否支持 CUDA,如果是,return GpuFoo class else return 是 CpuFoo.

的实例