【问题标题】:operator overloading in CudaCuda中的运算符重载
【发布时间】:2012-11-05 05:59:01
【问题描述】:

我通过这样做成功地在两个 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。

谢谢!

【问题讨论】:

    标签: cuda pycuda


    【解决方案1】:

    请注意错误中的“具有“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" 是否被即时编译系统发出。

    【讨论】:

    • 非常感谢,这很有道理!我会尽快尝试的。但是我们如何改变 pyCuda 编译代码的方式呢?
    • @WhitAngl:对不起,我忘了在答案中添加。看看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多