這裏是我的內核調用: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)
中的第三個參數。我應該如何確定在第三個參數中放置什麼?
我不認爲這是你的代碼。你剛剛在瀏覽器中輸入了這個嗎?你使用小寫字母s作爲dim3變量的'blocksize',並且在你的內核調用中使用大寫字母S作爲變量的'blockSize'。此代碼似乎有許多語法錯誤,並且也不完整。 SO期望:「關於您編寫的代碼問題,必須在問題本身中描述具體問題 - 幷包含有效代碼以再現問題 - 請參閱SSCCE.org以獲取指導。」您尚未提供SSCCE.org代碼,而你提供的片段沒有意義。 –
謝謝,我輸入了前兩行,所以我混合了語法錯誤。我編輯了代碼。現在應該是可編譯的。 –
閱讀SSCCE.org。這不僅僅是可編譯的。它應該是一個完整的代碼。無論如何,羅傑的回答應該整理你的代碼。而不是'(numBins/512 + 1,1,1)'(這是無效的,編譯器至少應該在該行上表示警告),你可以通過'dim3(numBins/512 + 1,1,1) )'(這是有效的)。但是,這最終會啓動3個塊,而不是2個,並且由於您的內核沒有線程檢查,所以會出現其他問題。此外,'printf'可能不是大量*內核輸出的可靠機制。 –