-2

我有以下代码片段:

__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));

此代码在 Tesla K40 上运行良好,但在 16GB Tesla V100 上运行良好。(即使是我的笔记本电脑也可以使用 4GB Quaddro M2200 GPU 运行代码)。

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

4

1 回答 1

-2

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

不过,我仍然可以提出几个建议:

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