我有 CUDA 内核,它采用 float3、int2 等结构作为参数。我似乎无法通过 cupy rawkernel 接口正确地将参数传递给这些内核。我尝试为 float3 参数传递 3 个浮点数的 1d Cupy 数组,但该参数在内核中未正确解释。我试过传递一个 ctypes 结构,但得到了一个不受支持的类型错误。是否可以将自定义结构发送到 cupy 中的原始内核?如果是这样,怎么做?
我尝试使用 ctype 结构如下:
class float3(ctypes.Structure):
fields = [ ("X", c_float), ("Y", c_float), ("Z", c_float)]
from cupy.cuda.function import CPointer
class CFloat3(CPointer):
def __init__(self, v): super().__init__(ctypes.addressof(v))
self.val = v
val= float3(1.5, 3, 5)
cval= CFloat3(val)
这绕过了 cupy 的类型检查,但仍然没有正确地将值传递给内核。如果您检查一下cupy源代码中的功能模块,它似乎应该可以工作。它只是传递结构的指针。我还尝试了 id(v) 和 ctypes.POINTER(float3)(v) 而不是 ctypes.addressof 来获取结构的地址,但这也不起作用。
我可以通过编写接受数组作为输入的内核包装器来解决这个问题,然后将数组转换为结构以调用我的常规内核。这对我来说很丑陋。如果这不能做到,那么不提供将结构传递给内核的能力似乎是一个很大的疏忽。