cudaMemcpyToSymbol只是挂起而永不返回。 GPU处理率为100%。代码在K40上工作正常但在V100上没有

时间:2018-06-18 05:22:52

标签: c++ cuda gpu tesla

我有以下代码段:

__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 Tesla V100。 (甚至我的笔记本电脑也可以使用4GB Quaddro M2200 GPU运行代码)。

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

1 个答案:

答案 0 :(得分:-1)

好吧,你还没有提供Minimal, complete, verifiable example:你的代码没有编译,缺少语句,但有(显然)不相关的语句。所以 - 没人能真正检查。

我仍然可以提出几点建议:

  1. 尝试使用此调用的异步版本:cudaMemcpyToSymbolAsync()。至少你的程序不会挂起......
  2. 在调试器中运行您的程序或应用程序(例如,大多数系统上的nVIDIA的nSight,或Windows上的Visual Studio扩展);或者,将调试器附加到挂起进程(MSVS instructionsEclipse instructions - old)。
  3. 在启用核心转储的情况下运行该进程(如果您使用的是Unix系统),在挂起时将其终止,然后在调试器中打开核心转储,您至少会获得回溯
  4. 尝试在启用较少优化的情况下重建程序 - 这有时会有所帮助,至少在诊断方面有用(这可以与之前的建议结合使用)。