2012-10-31 30 views
0

我有以下代码http://pastebin.com/vLeD1GJm至极工作得很好,但如果我增加:CUDA未指定发射失败的错误

#define GPU_MAX_PW 100000000 

到:

#define GPU_MAX_PW 1000000000 

然后我得到:

[email protected]:~/Dropbox/coisas/projetos/delta_cuda$ optirun ./a 
block size = 97657 grid 48828 grid 13951 

unspecified launch failure in a.cu at line 447.. err number 4 

我在有2GB内存的GTX 675M上运行它。 GPU_MAX_PW的第二个定义将有大约1000000000×2÷1024÷1024 = 1907 MB,所以我不会内存不足。因为我只分配更多内存,可能会出现什么问题?也许网格和块配置变得不可能?该错误是指向该行

注:

所有的
HANDLE_ERROR(cudaMemcpy(gwords, gpuHashes, sizeof(unsigned short) * GPU_MAX_PW, cudaMemcpyDeviceToHost)); 
+0

我在cudaThreadSynchronize()后添加了一个代码验证。并且错误在那里,而不是在验证结果 –

+0

如果您运行nvidia-smi -a(没有在GPU上运行)报告了多少空闲内存? –

+0

@RobertCrovella它报告“免费:2037 MB” –

回答

3

首先,你有你的尺寸不正确列出。该计划的工作量为10,000,000而不是100,000,000(而你说它的工作量为100,000,000而不是1,000,000,000)。所以内存大小不是问题,并且您的计算基于错误的数字。

calculate_grid_parameters被搞砸了。该功能的目标是根据指定所需线程总数和每块1024个线程(硬编码)的GPU_MAX_PW来计算需要多少块并因此确定网格大小。打印出块大小=网格...网格的线......实际上是解决问题的线索。对于100,000,000的GPU_MAX_PW,此函数正确计算需要100,000,000/1024 = 97657块。但是,网格尺寸计算错误。网格尺寸grid.x * grid.y应该等于所需块的总数(大约)。但是这个函数决定了它需要grid.x为48828,grid.y为13951.如果我乘以这两个,我得到681,199,428,这比想要的总块数97657大得多。现在,如果我然后启动一个内核要求的网格尺寸为48828(x)和13951(y),并且还要求每块1024个线程,我已经在该内核启动中请求了697,548,214,272个线程总数。首先,这不是你的意图,其次,虽然目前我不能确切地说出原因,但这显然太多了。只要说这个总的网格请求超过了机器的一些资源限制即可。

注意,如果你从亿下降到10,000,000为GPU_MAX_PW,网格运算变为“懂事”,我得到:

block size = 9766 grid 9766 grid 1 

,并没有发射失败。

+0

下面是该功能的一个固定版本http://pastebin.com/Azp6bVEz,现在它运行良好。谢谢! –

相关问题