gpt4 book ai didi

cuda - Cuda 中的运算符重载

转载 作者:行者123 更新时间:2023-12-01 12:50:02 36 4
gpt4 key购买 nike

我通过以下操作成功地在两个 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。

谢谢!

最佳答案

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

关于cuda - Cuda 中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13226712/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com