我有以下代码http://pastebin.com/vLeD1GJm可以正常工作,但如果我增加:
#define GPU_MAX_PW 100000000
为:
#define GPU_MAX_PW 1000000000
然后我收到:
frederico@zeus:~/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 :(得分:3)
首先,您的尺寸列表不正确。该计划的工作量为10,000,000而不是100,000,000(而你说它适用于100,000,000而不是1,000,000,000)。所以内存大小不是问题,你的计算基于错误的数字。
calculate_grid_parameters搞砸了。此函数的目的是根据GPU_MAX_PW确定需要多少块,从而确定网格大小,指定所需的线程总数和每块1024个线程(硬编码)。打印出块大小的行= grid ... grid ...实际上有问题的线索。对于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个线程。首先,这不是你的意图,其次,虽然目前我不能确切地说出原因,但这显然是太多的线索。可以说这个整体网格请求超出了机器的某些资源限制。
请注意,如果GPU_MAX_PW从100,000,000降至10,000,000,则网格计算变得“合理”,我得到:
block size = 9766 grid 9766 grid 1
并且没有发射失败。