使用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++使用。
我在想什麼?
您的目標是擁有_ _global_ _功能的課程嗎? – 4pie0
「我的問題是爲什麼它沒有被實現,到目前爲止,我還沒有想到一個能夠保持這個特性不被實現的原因。「 - 有可能實施的千百萬的東西,但沒有這種需要,它們仍未實現 – 4pie0
所以你的回答是:」它不是。「? – JorenHeit