【发布时间】:2015-11-24 00:06:28
【问题描述】:
我有一个被多次调用的 CUDA 内核(100 万不是上限)。我们是否再次启动内核取决于我们的内核返回的标志(result_found)。
for(int i = 0; i < 1000000 /* for example */; ++i) {
kernel<<<blocks, threads>>>( /*...*/, dev_result_found);
cudaMemcpy(&result_found, dev_result_found, sizeof(bool), cudaMemcpyDeviceToHost);
if(result_found) {
break;
}
}
分析器说 cudaMemcpy 的执行时间比实际的内核调用要多得多(cudaMemcpy:~88us,cudaLaunch:~17us)。
所以,问题是:
1) 有什么办法可以避免在这里调用 cudaMemcpy?
2) 到底为什么这么慢?将参数传递给内核(cudaSetupArgument)似乎非常快(~0.8 us),而返回结果却很慢。如果我删除 cudaMemcpy,我的程序完成速度会快很多,所以我认为这不是因为同步问题。
【问题讨论】:
-
还有其他方法(例如零拷贝),但在读取
result_found的值之前,它们仍将依赖于同步(强制内核完成)。您的分析方法可能存在缺陷。cudaLaunch(运行时 API 调用)的持续时间与内核的持续时间不同。您实际上应该在分析器中查看内核的持续时间(取决于您使用的分析器)。因此,这里的答案很可能只是您误解了探查器数据。但是如果没有更多关于你是如何分析的信息,我不能说得清楚。
标签: cuda