调用CUDA内核时出现“无效配置参数”错误?

问题描述 投票:0回答:2

这是我的代码:

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
只是打印错误代码相应的字符串消息。这部分代码在内核调用后给出配置错误。

什么可能会出现此错误,有什么想法吗?

cuda
2个回答
60
投票

这种类型的错误消息经常涉及启动配置参数(在这种情况下是网格/线程块尺寸,在其他情况下也可能是共享内存等)。当您看到这样的消息时,最好在启动内核之前打印出您的实际配置参数,看看您是否犯了任何错误。

你说

BLOCKDIM
= 512。你有
threadNum = BLOCKDIM/8
,所以
threadNum
= 64。你的线程块配置是:

dim3 dimBlock(threadNum,threadNum);

因此您要求启动 64 x 64 线程块,即每个块 4096 个线程。这不适用于任何一代 CUDA 设备。当前所有 CUDA 设备的每个块最多有 1024 个线程,这是 3 个块尺寸的乘积。

最大尺寸列于 CUDA 编程指南的中,也可通过

deviceQuery
CUDA 示例代码获得。


2
投票

只是为了添加之前的答案,您还可以找到代码中允许的最大线程数,因此它可以在其他设备上运行,而无需硬编码您将使用的线程数:

struct cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
cout<<"using "<<properties.multiProcessorCount<<" multiprocessors"<<endl;
cout<<"max threads per processor: "<<properties.maxThreadsPerMultiProcessor<<endl;
© www.soinside.com 2019 - 2024. All rights reserved.