2011-12-24 71 views
5

我做如下:初始化不允許__shared__變量CUDA

__shared__ int exForBlockLessThanP = totalElementLessThanPivotEntireBlock[blockIdx.x]; 

其中totalElementLessThanPivotEntireBlock是在GPU上的陣列。編譯器如問題標題所述那樣拋出錯誤。我真的不明白爲什麼這是一個問題?

回答

7

共享變量的靜態初始化在CUDA中是非法的。問題在於編程模型中未定義每個線程應如何處理共享內存的靜態初始化的語義。哪個線程應該寫入?如果線程之間的值不一致會發生什麼?編譯器應該如何爲這種情況發出代碼以及硬件如何運行它?

在你無意義的例子中,你要求塊中的每個線程都用一個值初始化同一個共享變量 - 基本上是一個靜態編譯的內存競賽。

+1

那麼,什麼是正確的方法? – Programmer

+0

請注意。在上面,我要求塊中的每個線程分配exForBlockLessThanp相同的值 – Programmer

+0

使用條件語句讓一個線程在內核開始時進行初始化 – talonmies