【问题标题】:how to synchronize between cuda kernel function?cuda内核函数之间如何同步?
【发布时间】:2012-03-28 06:23:06
【问题描述】:

我有两个这样的 cuda 内核函数

a<<<BLK_SIZE,THR_SIZE>>>(params,...);
b<<<BLK_SIZE,THR_SIZE>>>(params,...);

函数a启动后,我想等到a完成,然后再启动函数b。 所以我像这样在 a 和 b 之间插入了 cudaThreadSynchronize(),

a<<<BLK_SIZE,THR_SIZE>>>(params,...);
err=cudaThreadSynchronize();
if( err != cudaSuccess)
    printf("cudaThreadSynchronize error: %s\n", cudaGetErrorString(err));
b<<<BLK_SIZE,THR_SIZE>>>(params,...);

但是 cudaThreadSynchronize() 返回错误码:the launch timed out and was terminated cuda error

我该如何解决?


简单的代码说明:

mmap(sequence file);
mmap(reference file);

cudaMemcpy(seq_cuda, sequence);
cudaMemcpy(ref_cuda,reference);

kernel<<<>>>(params); //find short sequence in reference
cudaThreadSynchronize();
kernel<<<>>>(params);

cudaMemcpy(result, result_cuda);
report result

在内核函数中,有一个很大的 for 循环,其中包含一些 if-else 用于模式匹配算法以减少比较次数。

【问题讨论】:

  • 在 Nvidia 的 CUDA 论坛(例如,cuda the launch timed out and was terminated)中,人们指出在 GPU 上运行时间过长的内核也用于视频显示。解决方案是缩短内核或使用不同的 GPU(例如集成显卡)来驱动您的显示器。
  • 你使用的是什么操作系统?

标签: cuda synchronize


【解决方案1】:

此启动错误意味着您的第一个内核启动时出现了问题,甚至可能在此之前出现了问题。要解决这个问题,请尝试检查所有 CUDA 运行时调用的输出是否有错误。此外,在所有内核调用之后执行 cudaThreadSync 和错误检查。这应该可以帮助您找到发生错误的第一个位置。

如果确实是启动失败,则需要排查内核的执行配置和代码,找出错误原因。

最后,请注意,您添加 cudaThreadSynchronize 的操作极不可能导致此错误。我这样说是因为您对查询的措辞指向 cudaThreadSynchronize 作为罪魁祸首。这个调用所做的只是更早地捕获您现有的错误。

【讨论】:

  • 我在调用a之前检查了所有内核调用,但没有错误。那么在函数a期间可能会出现“启动超时并终止cuda错误”??
  • Enc:是的,内核 a 一定有问题。它的执行配置或您在其内核中所做的事情。
  • 感谢阿什温。对这种情况有什么猜测吗?我不知道是哪一个导致了这个问题。我认识到的一件事是,当我使用小数据(~10 MB)时,它工作得很好,但我使用更大的数据(几百 MB,但适合显卡上的内存),它不起作用。
  • Enc:如果您在问题中分享一些内核代码可能会有所帮助。
  • 我的代码基本上是模式匹配,它报告“短序列”在长“参考”中出现的次数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2023-04-06
  • 1970-01-01
  • 2012-01-18
相关资源
最近更新 更多