&引用;无效的配置参数";调用CUDA内核时出错?

&引用;无效的配置参数";调用CUDA内核时出错?,cuda,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

这是我的密码:

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");
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=块s1;
dimGrid.y=块S2;
//dim3 numThreads2(块DIM);
//dim3 numBlocks2(numPixels/BLOCKDIM+(numPixels%BLOCKDIM==0?0:1));
执行缩放(imageDevice、imageDevice、new、min、max、nWidth、nHeight);
cudaError_t err=cudaGetLastError();
cudasafe(呃,“内核2”);
这是我的第二个内核的执行,它完全独立于数据的使用
BLOCKDIM
为512,
nWidth和nHeight
也为512,
cudasafe
仅打印错误代码的相应字符串消息。这段代码在内核调用之后给出了配置错误


是什么导致了这个错误,知道吗?

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

你说的是
BLOCKDIM
=512。您有
threadNum=BLOCKDIM/8
所以
threadNum
=64。您的threadblock配置为:

dim3 dimBlock(threadNum,threadNum);
因此,您要求启动64 x 64个线程的块,即每个块4096个线程。这在任何一代CUDA设备上都不起作用。所有当前CUDA设备的最大线程数限制为每个块1024个,这是3个块尺寸的乘积


CUDA编程指南的中列出了最大尺寸,也可通过
deviceQuery
CUDA示例代码获得。

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

struct cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
cout<<"using "<<properties.multiProcessorCount<<" multiprocessors"<<endl;
cout<<"max threads per processor: "<<properties.maxThreadsPerMultiProcessor<<endl;
struct-cudaDeviceProp属性;
CudaGetDeviceProperty(属性和设备);

我知道我的卡每个块有1024个线程的配置。具有32*32 2D配置和具有1D 1024线程配置是否相同?1024线程是每个块的限制。您可以拥有任何一组不超过此值的1D、2D或3D标注。因此,1024x1、512x2、256x4、128x8等都是可接受的二维限值。同样,对于3D,例如16x8x8、32x8x4、64x4x4等都是可接受的3D限制。
deviceQuery
cuda示例将提供有关总尺寸和每尺寸限制的信息。但无论每维限制如何,实际总产品不能超过1024的总限制或适合您的设备的任何限制。
MaxThreadsMultiProcessor
对于大多数CUDA GPU来说是2048,并且不表示任何关于threadblock级别限制的内容,这就是问题中讨论的内容,
device
来自哪里?@BitTickler我发现这是你的设备的索引。如果只有一个GPU,则通常为0。