3

我通过执行以下操作成功地在两个 float4 之间创建了一个 operator+:

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

但是,如果另外,我想为 uchar4 提供一个 operator+,通过对 uchar4 执行相同的操作,我会收到以下错误:“错误:多个重载函数“operator+”实例具有“C”链接“”

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

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

谢谢!

4

1 回答 1

4

请注意错误中的“具有“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_extern_c 可用于控制是否extern "C"由即时编译系统发出。

于 2012-11-05T07:57:17.380 回答