0

我有以下代码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));
4

1 回答 1

3

首先,您的尺码列出不正确。该程序适用于 10,000,000 而不是 100,000,000(而您说它适用于 100,000,000 而不是 1,000,000,000)。所以内存大小不是问题,你的计算是基于错误的数字。

calculate_grid_parameters 搞砸了。此函数的目标是根据 GPU_MAX_PW 指定需要的线程总数和每个块 1024 个线程(硬编码)来确定需要多少块以及网格大小。打印出块大小=网格...网格...的行实际上有问题的线索。对于 100,000,000 的 GPU_MAX_PW,此函数正确计算需要 100,000,000/1024 = 97657 个块。但是,网格尺寸计算不正确。网格尺寸 grid.x * grid.y 应该等于所需的块总数(大约)。但是这个函数决定它需要 48828 的 grid.x 和 13951 的 grid.y。如果我将这两个相乘,我得到 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

并且没有发射失败。

于 2012-11-01T03:02:59.740 回答