Cuda中的运算符重载

Cuda中的运算符重载,cuda,pycuda,Cuda,Pycuda,通过执行以下操作,我成功地在两个float4之间创建了运算符+: __device__ float4 operator+(float4 a, float4 b) { // ... } 但是,如果另外,我想为uchar4使用运算符+,通过对uchar4执行相同的操作,我会得到以下错误: 错误:重载函数“运算符+”的多个实例具有“C”链接 当我声明具有相同名称但参数不同的多个函数时,会收到类似的错误消息。 因此,有两个问题: 多态性:Cuda中是否可能有多个同名不同参数的函数?如果是,为什么会

通过执行以下操作,我成功地在两个float4之间创建了运算符+:

__device__ float4 operator+(float4 a, float4 b) {
 // ...
}
但是,如果另外,我想为uchar4使用运算符+,通过对uchar4执行相同的操作,我会得到以下错误: 错误:重载函数“运算符+”的多个实例具有“C”链接

当我声明具有相同名称但参数不同的多个函数时,会收到类似的错误消息。 因此,有两个问题:

  • 多态性:Cuda中是否可能有多个同名不同参数的函数?如果是,为什么会出现此错误消息
  • operator+for float4:似乎这个特性已经包含在“cutil_math.h”中,但是当我包含这个(
    #include
    )时,它抱怨没有这样的文件或目录……我应该做什么?注意:我使用的是pycuda,它是python的cuda

谢谢!

< P>注意错误中的“有”C链接。你正在用C链接编译你的代码(PycUDA默认是为了避开符号的问题)。C++不能支持使用C链接的同一个函数名的多个定义。

解决方案是在不自动生成“extern C”的情况下编译代码,并仅为内核显式指定C链接。因此,您的代码如下所示:

__device__ float4 operator+(float4 a, float4 b) { ... };

extern "C"
__global__ void kernel() { };
而不是标准的pyCUDA排放:

extern "C" 
{
     __device__ float4 operator+(float4 a, float4 b) { ... };

     __global__ void kernel() { };
}

pycuda.compiler.SourceModule
有一个选项
no\u extern\u c
,可用于控制
extern“c“
是否由即时编译系统发出。

非常感谢,这很有意义!我会尽快试一试的。但是我们如何改变pyCuda编译代码的方式呢?@WhitAngl:对不起,我忘了在答案中加上这个。看看我的编辑。