Cuda中的运算符重载
通过执行以下操作,我成功地在两个float4之间创建了运算符+:Cuda中的运算符重载,cuda,pycuda,Cuda,Pycuda,通过执行以下操作,我成功地在两个float4之间创建了运算符+: __device__ float4 operator+(float4 a, float4 b) { // ... } 但是,如果另外,我想为uchar4使用运算符+,通过对uchar4执行相同的操作,我会得到以下错误: 错误:重载函数“运算符+”的多个实例具有“C”链接 当我声明具有相同名称但参数不同的多个函数时,会收到类似的错误消息。 因此,有两个问题: 多态性:Cuda中是否可能有多个同名不同参数的函数?如果是,为什么会
__device__ float4 operator+(float4 a, float4 b) {
// ...
}
但是,如果另外,我想为uchar4使用运算符+,通过对uchar4执行相同的操作,我会得到以下错误:
错误:重载函数“运算符+”的多个实例具有“C”链接
当我声明具有相同名称但参数不同的多个函数时,会收到类似的错误消息。
因此,有两个问题:
- 多态性:Cuda中是否可能有多个同名不同参数的函数?如果是,为什么会出现此错误消息
- operator+for float4:似乎这个特性已经包含在“cutil_math.h”中,但是当我包含这个(
)时,它抱怨没有这样的文件或目录……我应该做什么?注意:我使用的是pycuda,它是python的cuda#include
谢谢!
< 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:对不起,我忘了在答案中加上这个。看看我的编辑。