cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但

cudaMemcpyToSymbol just hangs and never returns. GPU processing at 100%. Code works fine on K40 but not on V100

本文关键字:K40 代码 100% 工作 处理速度 挂起 永远 GPU 返回 cudaMemcpyToSymbol      更新时间:2023-10-16

我有以下代码片段:

__constant__ int baseLineX[4000];
__constant__ int baseLineY[4000];
__constant__ int guideLineX[4000];
__constant__ int guideLineY[4000];
__constant__ int rectangleOffsets[8];
__constant__ float blurKernel[64];
<other code>
for(int i = 0; i < 8; i++)
hostRectangleOffsets[i] = i;
cudaMemcpyToSymbol(rectangleOffsets, hostRectangleOffsets, 8*sizeof(int));

此代码在特斯拉 K40 上工作正常,但在 16GB 特斯拉 V100 上无效。(甚至我的笔记本电脑也可以使用4GB Quaddro M2200 GPU运行代码(。

代码只是挂在 V100 上,永远不会从 cudaMemcpyToSymbol 调用返回,但看起来它仍在 GPU 上处理。有什么想法吗?

好吧,你还没有提供一个最小、完整、可验证的例子:你的代码不会编译并且缺少语句,但(显然(有不相关的语句。所以 - 没有人可以真正检查。

不过,我仍然可以提出一些建议:

  1. 尝试使用此调用的异步版本:cudaMemcpyToSymbolAsync()。至少你的程序不会挂起...
  2. 首先在调试器中运行程序或应用程序(例如,nVIDIA在大多数系统上的nSight,或它们在Windows上的Visual Studio的扩展(;或者,将调试器附加到挂起进程(MSVS指令,Eclipse指令 - 旧(。
  3. 在启用核心转储的情况下运行进程(如果你在 Unix'ish 系统上(,在挂起时杀死它,然后在调试器中打开核心转储,你至少会得到回溯
  4. 尝试在启用较少优化的情况下重建程序 - 这有时会有所帮助,至少对于诊断目的(这可以与前面的建议结合使用(。