2012-11-05 89 views
3
超載

我成功做創建了兩個float4變量之間的運營商+:運營商的Cuda

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

但是,如果另外,我想+爲uchar4,通過與uchar4做同樣的事情有一個運營商,我得到以下錯誤: 「錯誤:重載函數的多個實例‘運營商+’有‘C’鏈接」「

我得到一個類似的錯誤消息時,我聲明瞭同名但不同參數的多個功能 左右。 ,兩個問題:

  • 多態現象:是否可以在Cuda中具有多個具有相同名稱和不同參數的函數?如果是這樣,爲什麼我有這個錯誤信息?
  • operator + for float4:看起來這個特性已經包含了「cutil_math.h」,但是當我包含它時(#include <cutil_math.h>)它抱怨沒有這樣的文件或目錄......任何特別的我應該做什麼?注意:我正在使用pycuda,它是python的一個cuda。

謝謝!

回答

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具有可以用來控制extern "C"是否由即時編譯發出一個選項no_extern_c系統與否。

+0

非常感謝,這很有道理!我會盡快嘗試。但是,我們如何改變pyCuda編譯代碼的方式? – WhitAngl

+0

@WhitAngl:對不起,我忘了在答案中加上。看看我的編輯。 – talonmies

+0

謝謝,這工作得很好! :) – WhitAngl