2013-08-31 140 views
6

使用nvcc(CUDA 5.0)編譯下面的代碼時,出現錯誤「內存限定符的非法組合」,因爲顯然不可能在一個類中具有全局內核。CUDA:爲什麼不可能定義靜態全局成員函數?

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__global__ void A::kernel() 
{} 

非靜態成員打交道時,我能理解這個限制,但是當內核定義爲靜態的,爲什麼還是會出現錯誤?這種成員的調用與在名稱空間中聲明時調用該函數沒有區別(在這種情況下爲A)。

A::kernel <<< 1, 1 >>>(); 

是否有一個原因我錯過了爲什麼這還沒有實現(還)?

編輯:根據答案和評論中的答覆,我的問題還不夠清楚。我的問題不是爲什麼會出現錯誤。顯然,這是因爲它還沒有實施。我的問題是爲什麼它尚未實現。到目前爲止,我還沒有想到一個能夠實現這個功能的理由。我意識到我可能已經忘記了一件會使事情複雜化的特例,因此也就是這個問題。

我相信這是一個合理的功能的原因是:

  • 靜態函數沒有this指針所以,即使內核被稱爲是生活在主機上的對象,有在訪問其數據時沒有衝突,因爲這些數據首先是不可訪問的(來自哪個對象的數據??)。
  • 你可能會爭辯說,如果類有與之相關的靜態數據,生活在主機上,原則上應該可以從靜態內核訪問。但是,靜態數據也不受支持,所以再次沒有衝突。
  • 在主機上調用的對象上的靜態內核(A a; a.staticKernel<<<...,...>>>();)將完全等同於調用它沒有在所有(A::staticKernel<<<...,...>>>();的對象),因爲我們在普通的C++使用。

我在想什麼?

+0

您的目標是擁有_ _global_ _功能的課程嗎? – 4pie0

+0

「我的問題是爲什麼它沒有被實現,到目前爲止,我還沒有想到一個能夠保持這個特性不被實現的原因。「 - 有可能實施的千百萬的東西,但沒有這種需要,它們仍未實現 – 4pie0

+0

所以你的回答是:」它不是。「? – JorenHeit

回答

1

幸運的是,這個問題後約4年一直問,clang 4.0 can compile the CUDA language看看這個例子:

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__device__ void A::kernel() 
{} 

int main() 
{ 
    A::kernel <<< 1, 1 >>>(); 
}; 

當我試着使用鐺4.0編譯,我得到以下錯誤:

test.cu:7:1: error: kernel function 'kernel' must be a free function or static member function 
__global__ void A::kernel() 
^ 
/usr/local/cuda/include/host_defines.h:191:9: note: expanded from macro '__global__' 
     __location__(global) 
     ^
/usr/local/cuda/include/host_defines.h:88:9: note: expanded from macro '__location__' 
     __annotate__(a) 
     ^
/usr/local/cuda/include/host_defines.h:86:9: note: expanded from macro '__annotate__' 
     __attribute__((a)) 
     ^
test.cu:7:20: error: __host__ function 'kernel' cannot overload __global__ function 'kernel' 
__global__ void A::kernel() 
       ^
test.cu:4:28: note: previous declaration is here 
    __global__ static void kernel(); 
         ^
2 errors generated. 

爲了滿足這些錯誤,我已經內聯內核定義爲類聲明:

class A 
{ 
public: 
    __global__ static void kernel() 
    { 
     // implementation would go here 
    } 
}; 

然後鐺4.0成功編譯它,它可以不被執行任何錯誤。所以這顯然不是CUDA 語言的限制,而是其事實上的標準編譯器。順便說一句,nvcc有許多類似的不合理的限制,鏗鏘有沒有。

+0

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#function-members – talonmies

+0

@talonmies部分[E.編程指南的C/C++語言支持](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-cplusplus-language-support)僅僅是一個(部分)規範'nvcc'確實或不支持。它與CUDA語言規範沒有任何關係,不幸的是它不存在。 [B. C語言擴展](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions)部分很接近,但它與'nvcc'細節和CUDA運行時API。 –

相關問題