我的代码的一个非常简化的版本如下:
do {
//reset loop variable b to 0/false
b = 0;
// execute kernel
kernel<<<...>>>(b);
// use the value of b for while condition
} while(b);
布局变量b
可以由true
中的任何线程设置为kernel
,并告诉我们是否继续运行循环。
使用cudaMalloc
,cudaMemset
和cudaMemcpy
我们可以创建/设置/复制device
内存来实现此目的。但是我刚发现固定内存的存在。在一个简单的测试程序中,使用cudaMalloHost
分配b
并在内核之后立即调用cudaDeviceSynchronize
可以加快速度(~50%)。
固定内存是此布尔变量b
的最佳选择还是有更好的选择?
答案 0 :(得分:2)
您尚未显示初始代码和已修改的代码,因此没有人能够了解您在帖子中提到的改进的详细信息。
您问题的答案取决于
如果主机端的 b 导致许多主机内存事务,则将其保留在GPU全局内存中并在每次循环迭代结束时将其传回是合乎逻辑的。您可以使用与内核相同的流中的异步副本快速完成此操作,并在之后与主机同步。
以上所有项目均适用于启用缓存的设备。如果你的设备是pr-Fermi(CC <2.0),那么故事就不同了。