2012-07-20 16 views
1

我有一個在主機和設備代碼上使用的類,以便於數據傳遞。這個類有一些操縱數據的方法。一個簡單的例子是:源文件上的CUDA - __device__方法

struct Vector { 
    float x, y, z; 
    __host__ __device__ Vector(float _x, float _y, float _z) { 
    //... 
    } 
}; 

如果我實現一個頭文件這個類,它工作正常,NVCC是幸福的。但是,如果我嘗試在源文件上實現構造函數,nvcc會抱怨構造函數不是內聯的。無論如何繞過這個或那只是編譯器的限制?

+0

你試過'__forceinline__'說明嗎?源文件是指.cu文件還是.cpp文件? – geek 2012-07-22 18:47:47

+0

是的,我嘗試過'__forceinline__'。我想要做的是將課程分成源代碼(.cu)和頭文件(.cuh),但NVCC似乎不允許用於設備類。 – 2012-07-24 14:38:53

+0

您使用的是CUDA和CUDA架構的版本? – geek 2012-07-24 18:12:43

回答

1

直到CUDA 5.0 CUDA編譯器都有限制,即內核所需的所有內容(即__global__函數)必須位於單個翻譯單元中。對於費米前期器件(即計算能力1.x),編譯器還必須內聯所有__device__函數。因此,如果你有在a.cu文件中定義的結構和使用在b.cu中定義的結構的__global__內核,那麼當編譯器正在處理b.cu時,它將無法找到__device__函數。

使用CUDA 5.0,您可以分別編譯這兩個文件並將它們鏈接在一起。這仍然需要費米或更高版本(2.x或更高版本)。