主机循环的CUDA布尔变量

时间:2015-02-03 16:40:19

标签: c++ c cuda

我的代码的一个非常简化的版本如下:

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,并告诉我们是否继续运行循环。

使用cudaMalloccudaMemsetcudaMemcpy我们可以创建/设置/复制device内存来实现此目的。但是我刚发现固定内存的存在。在一个简单的测试程序中,使用cudaMalloHost分配b并在内核之后立即调用cudaDeviceSynchronize可以加快速度(~50%)。

固定内存是此布尔变量b的最佳选择还是有更好的选择?

1 个答案:

答案 0 :(得分:2)

您尚未显示初始代码和已修改的代码,因此没有人能够了解您在帖子中提到的改进的详细信息。

您问题的答案取决于

  1. b 被读取或写入或仅写入GPU内核。如果在缓存中找不到 b 导致延迟,则读取可能需要直接从主机端获取实际值。另一方面,如果有进一步的操作可以保持线程忙,则可以覆盖写入延迟。
  2. 修改值的频率。如果您在程序中频繁访问该值,GPU可能会将变量保留在L2内,从而避免主机端访问。
  3. 访问 b 之间的内存操作频率。如果访问 b 之间存在许多内存事务,则缓存中的 b 更可能被其他一些内容替换。因此,再次访问时,在缓存中找不到 b ,并且需要耗时的主机访问。
  4. 如果主机端的 b 导致许多主机内存事务,则将其保留在GPU全局内存中并在每次循环迭代结束时将其传回是合乎逻辑的。您可以使用与内核相同的流中的异步副本快速完成此操作,并在之后与主机同步。

    以上所有项目均适用于启用缓存的设备。如果你的设备是pr-Fermi(CC <2.0),那么故事就不同了。