2013-12-08 85 views
0

這裏是我的內核調用:Cuda內核 - 第二塊未能啓動?

const size_t numBins = 1024; 
const dim3 blockSize(512); 
unsigned int * d_binHistogram, * d_cdf; 
checkCudaErrors(cudaMalloc((void**) &d_binHistogram, sizeof(unsigned int)*numBins)); 
checkCudaErrors(cudaMemset(d_binHistogram, 0, sizeof(unsigned int)*numBins)); 
checkCudaErrors(cudaMalloc((void**) &d_cdf, sizeof(unsigned int)*numBins)); 
checkCudaErrors(cudaMemset(d_cdf, 0, sizeof(unsigned int)*numBins)); 
blellochScan<<<(numBins/512+1,1,1),blockSize,blockSize.x*sizeof(float)>>>(d_binHistogram, numBins, d_cdf); 
cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); 

這裏是內核:

__global__ void blellochScan(const unsigned int* const d_bin, const size_t numBins, 
            unsigned int* const d_cdf){ 
unsigned int i = blockIdx.x*blockDim.x+threadIdx.x; 
unsigned int result = 0; 
for(unsigned int j = 0; j<i; j++){ 
    result += d_bin[j]; 
} 
d_cdf[i] = result; 
printf("%u %u\n", i, d_cdf[i]); 
} 

在輸出中,只有i值從0到511,沒有i值從512至1023的第二塊。我做錯了什麼?

此外,我不確定內核啓動blockSize.x*sizeof(float)中的第三個參數。我應該如何確定在第三個參數中放置什麼?

+0

我不認爲這是你的代碼。你剛剛在瀏覽器中輸入了這個嗎?你使用小寫字母s作爲dim3變量的'blocksize',並且在你的內核調用中使用大寫字母S作爲變量的'blockSize'。此代碼似乎有許多語法錯誤,並且也不完整。 SO期望:「關於您編寫​​的代碼問題,必須在問題本身中描述具體問題 - 幷包含有效代碼以再現問題 - 請參閱SSCCE.org以獲取指導。」您尚未提供SSCCE.org代碼,而你提供的片段沒有意義。 –

+0

謝謝,我輸入了前兩行,所以我混合了語法錯誤。我編輯了代碼。現在應該是可編譯的。 –

+0

閱讀SSCCE.org。這不僅僅是可編譯的。它應該是一個完整的代碼。無論如何,羅傑的回答應該整理你的代碼。而不是'(numBins/512 + 1,1,1)'(這是無效的,編譯器至少應該在該行上表示警告),你可以通過'dim3(numBins/512 + 1,1,1) )'(這是有效的)。但是,這最終會啓動3個塊,而不是2個,並且由於您的內核沒有線程檢查,所以會出現其他問題。此外,'printf'可能不是大量*內核輸出的可靠機制。 –

回答

0

未來,請創建一個完整的,可編輯的示例,顯示您詢問的問題並將其複製/粘貼到問題中。

。在你的網格大小計算錯誤:

(numBins/512+1,1,1) 

將總是爲1(最後一個逗號後的值),因爲您提供的表達式用於創建dim3一個逗號分隔的列表,沒有參數。

內核啓動的第三個參數是要分配的共享內存的字節數。由於您沒有在內核中使用共享內存,因此可以不使用此參數。

由於您的箱數可以被塊大小整除,因此您可以進一步簡化表達式。

所以,你的內核調用應該是:

const size_t numBins(1024); 
const size_t blockSize(512); 
dim3 blocks(numBins/blockSize); 
blellochScan<<<blocks, blockSize>>>(...); 
+0

太好了,謝謝。我有一個問題:因爲'blockSize'是一個'dim3'變量,在內核啓動時,它不應該是'numBins/blockSize.x'嗎? –

+0

blocks和blockSize參數可以是標量或'dim3'。您可以選擇尺寸以適合您的算法。所啓動的塊和線程的數量將是尺寸的乘積。 –