【问题标题】:CUDA unspecified launch failure errorCUDA 未指定的启动失败错误
【发布时间】:2012-10-21 12:59:50
【问题描述】:

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

【问题讨论】:

  • 我在cudaThreadSynchronize()之后添加了一个验证码;并且错误就在那里,而不是在复制结果
  • 如果你运行 nvidia-smi -a(GPU 上没有运行任何东西)报告了多少可用内存?
  • @RobertCrovella 它报告“免费:2037 MB”
  • 您的 GTX 675M 是否也显示用户界面?在出现错误之前,您的内核使用#define GPU_MAX_PW 1000000000 运行了多长时间?当操作系统回收 GPU 用于 UI 显示时,您可能会遇到超时。
  • @tera 不,我正在使用我的英特尔显卡进行显示,GTX 675M 仅在我调用它时使用。时间大约是 3 秒

标签: cuda


【解决方案1】:

首先,您的尺码列出不正确。该程序适用于 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-12-20
  • 2016-08-29
  • 2020-12-23
  • 2012-04-11
  • 1970-01-01
  • 2013-07-04
  • 2011-09-27
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多