2013-04-20 70 views
17

這裏是我的代碼:「無效的配置參數」錯誤?

int threadNum = BLOCKDIM/8; 
dim3 dimBlock(threadNum,threadNum); 
int blocks1 = nWidth/threadNum + (nWidth%threadNum == 0 ? 0 : 1); 
int blocks2 = nHeight/threadNum + (nHeight%threadNum == 0 ? 0 : 1); 
dim3 dimGrid; 
dimGrid.x = blocks1; 
dimGrid.y = blocks2; 

// dim3 numThreads2(BLOCKDIM); 
// dim3 numBlocks2(numPixels/BLOCKDIM + (numPixels%BLOCKDIM == 0 ? 0 : 1)); 
perform_scaling<<<dimGrid,dimBlock>>>(imageDevice,imageDevice_new,min,max,nWidth, nHeight); 
cudaError_t err = cudaGetLastError(); 
cudasafe(err,"Kernel2"); 

這是我的第二個內核的執行,它是在數據的使用期限完全獨立。 BLOCKDIM是512,nWidth and nHeight也是512並且cudasafe只是簡單地打印錯誤代碼的相應字符串消息。代碼的這一部分在內核調用之後發生配置錯誤。

什麼可能會給這個錯誤,任何想法?

回答

27

此類型的錯誤消息經常指的是啓動配置參數(網格/在這種情況下threadblock尺寸,也可以共享存儲器等在其他情況下)。當你看到這樣的消息時,在啓動內核之前打印出你的實際配置參數是一個好主意,看看你是否犯了什麼錯誤。

你說BLOCKDIM = 512你有threadNum = BLOCKDIM/8所以threadNum = 64你threadblock配置爲:

dim3 dimBlock(threadNum,threadNum); 

所以你要求推出的64×64個線程塊,即每塊4096個線程。這對任何一代CUDA設備都無效。

+0

我知道我的卡每塊有1024個線程的配置。擁有32 * 32 2D配置和havin 1D 1024線程配置是否一樣? – erogol 2013-04-20 21:47:48

+4

1024個線程是以每個塊爲基礎的限制。您可以擁有任何不超過此尺寸的一維,二維或三維尺寸。因此1024x1,512x2,256x4,128x8等都是可以接受的2D限制。類似地,對於3D,例如16x8x8,32x8x4,64x4x4等都是可以接受的3D限制。 'deviceQuery' cuda示例將提供關於總體和每維度限制的信息。但是,無論每個尺寸限制如何,實際的總產品數量都不能超過總限制1024或適用於您的設備的任何限制。 – 2013-04-20 21:52:16

1

只需添加到以前的答案,你可以找到允許在你的代碼也是最大線程數,因此它可以在其他設備沒有硬編碼您將使用的線程數運行:

struct cudaDeviceProp properties; 
cudaGetDeviceProperties(&properties, device); 
cout<<"using "<<properties.multiProcessorCount<<" multiprocessors"<<endl; 
cout<<"max threads per processor: "<<properties.maxThreadsPerMultiProcessor<<endl;