2014-12-06 35 views
2

在我的內核中,我需要一個累加器數組。OpenCL是否支持數組初始值設定項,包括默認初始值爲0?

__kernel myKernel(...) 
{ 
    float accum[SIZE] = {}; 

    for(i=0; i<ITER; ++i) { 
     accum[...] += ... 
    } 

    ... 
} 

在C中,= {}將數組初始化爲我充滿0,但我不知道這是在OpenCL的情況?我需要類似以下的東西嗎,還是浪費週期?

float accum[SIZE]; 
for(int i=0; i<SIZE; ++i) accum[i] = 0; 
+0

您的示例中沒有任何變量是靜態分配的。他們都是私人的(或自動的)。我建議標題爲「OpenCL是否支持數組初始值設定項?」或類似的東西。 – Tim 2014-12-06 19:44:49

+0

@Tim好點,謝謝。 – 2014-12-08 13:52:08

+0

也是FWIW我在英特爾GPU OpenCL實現(= {0})中使用了零初始化器。我記得運行到一個隨機大小限制,但(編譯錯誤,如果太大)。 – Tim 2014-12-08 17:25:56

回答

3

OpenCL C是ISO/IEC 9899:1999 C語言規範(又名C99)的衍生產品。在兩個規範中,是的,= { 0 }將對數組進行初始化(請注意0,空初始化程序列表爲not allowed in C)。

實際上,在啓動內核之前,某些實現可能會用零清零設備專用和/或本地內存,但這不是您可以依賴的行爲。

+0

我知道OpenCL是一個C衍生物,但是你可以指向OpenCL規範中明確要求初始化的地方嗎?我問,因爲我擔心爲了簡化OpenCL規範/驅動程序,可能已經取消了這個要求。 – 2014-12-08 13:55:37

+0

OpenCL規範本身沒有涵蓋那個精確的點,只是簡單地將您重定向到ISO C99規範(如果內存服務的話,前幾頁的某處)。因此,C99規則適用於:您不需*初始化變量,但如果您不需要,則內容未定義。 – 2014-12-08 14:20:49

+1

討厭死靈這一點,但我不認爲這實際上是正確的:這個這麼回答(http://stackoverflow.com/questions/17589533/is-an-empty-initializer-list-valid-c-code/17589839 #17589839)顯示不允許使用空啓動器。在規範中沒有找到相關的東西,但他提出了一個很好的論點。也許OpenCL C規範對此有不同的看法? – bobismijnnaam 2016-06-07 09:57:27

相關問題