cuda - CUDA内核调用出现"invalid configuration argument "错误?

标签 cuda

这是我的代码:

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 和 nHeight 也是 512 ,而 cudasafe 只是打印错误代码相应的字符串消息。这部分代码在内核调用后立即出现配置错误。

什么可能会导致此错误,有什么想法吗?

最佳答案

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

您说 BLOCKDIM = 512。您有 threadNum = BLOCKDIM/8,因此 threadNum = 64。您的线程 block 配置是:

dim3 dimBlock(threadNum,threadNum);

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

最大尺寸列于table 14中CUDA 编程指南,也可通过 deviceQuery CUDA 示例代码获取。

关于cuda - CUDA内核调用出现"invalid configuration argument "错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125389/

相关文章:

cuda - double 的纹理对象

cuda - GPU 中的同步

cuda - CUDA中的杂项和线程间通信指令

c++ - 如何销毁 CUDA 图形数据类型

ubuntu - Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

c++ - 与 CPU 版本相比,OpenCV GPU 对象检测速度较慢且检测次数较少

cuda - GPU 上的广义滑动窗口计算

c++ - nppiResizeSqrPixel_32f_C4R() 如何工作?

CUDA 统一内存工作(具体来说,cudaMallocManaged();)

c++ - nvcc 致命 : Value 'sm_13' is not defined for option 'gpu-architecture'