2011-08-17 17 views
0

所以,如果我有一個設備(或全球)函數創建/一些數據複製到共享內存和我再打另一設備功能,像這樣:如果我在一個函數中創建/分配共享內存,我可以在我不能調用的函數內部使用它嗎?

__global__ void a(){ 
    __shared__ int blah=0; 
    fun(); 
} 
__device__ void fun(){ 
    blah = 1; //perform some operations 
    //do whatever 
} 

我有點生疏與我的CUDA,我想你可能不得不「重新定義」共享變量(我假設操作檢查是否存在該名稱的共享變量,如果這樣分配它) - 這有創建上下文的效果 - 所以基本上這個變量不是從哪裏來的。或者,如果它與標準C/C++中的全局變量相似,並且我可以像上面那樣引用它,那就太棒了。

我很熟悉內存層次結構,我只是在創建/引用內存的語義上生鏽。

請告知上述草圖是否可行。謝謝。

回答

2

沒有,這將無法在CUDA中工作,它再也不會在標準C99中工作。目前,__device__函數編譯的首選方法是內聯擴展(它們也被編譯爲Fermi體系結構的獨立代碼對象),但即使如此__device__函數仍然必須遵守C99的標準語法和範圍約定。所以你需要通過引用__device__函數來傳遞沒有編譯單元範圍的參數。

+0

但是,如果您有多個線程 - 您無法傳遞引用,則每個線程都會嘗試分配該名稱的共享內存,因此該塊中的所有線程都可以訪問__shared__變量。 – Nisk

+3

當然,您可以將對共享內存變量的引用傳遞給設備函數,並且完全有效。出於_correctness_原因,您所做的例子不會無條件地完成,但運行時會發生什麼,編譯時會發生什麼是完全不同的問題。 – talonmies

相關問題