gpt4 book ai didi

c++ - 如何在设备内存中有效地随机播放数据?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:44 24 4
gpt4 key购买 nike

问题

在设备全局内存中移动许多随机(非合并)值时,哪种方法最有效?

注意:许多值大于 500。

上下文

我从事 GPU 的遗传算法实现已有一段时间了,我一直在努力在我的框架的灵 active 和 GPU 架构的微优化之间挣扎。 GA 数据始终驻留在 GPU 中。只有最佳代解决方案被复制到主机内存。

详细场景

我正在优化迁移功能。这里基本上很少有数据在设备全局内存中随机播放。但是我以这样的方式获得了我的数据顺序,它为 GA 运算符内核线程的内存访问方案合并,这使得洗牌一对“基因组”,一个跨越单个 FLOAT 值的问题,并以相同的跨步方式将它们与另一个基因组交换。

已知解决方案

问题不在于内存带宽,而是调用延迟和线程阻塞导致进程停滞的问题。

  1. 我写了几个设备内核,其功能只是在地址之间移动值。这将启动一个内核(具有非常低的占用率、不同的代码和随机内存访问......因此它运行的小代码将被序列化),但只需对设备进行两次内核调用即可完成工作。

    • 第一个内核将值复制到缓冲区数组。
    • 第二次内核交换值。
  2. 我知道我可以为每个值使用 cudaMemcpy,但这需要多次调用 cudaMemCpy,我认为这是同步的调用

简化的代码示例:

int needed_genome_idx = 0; // Some random index.
for(int nth_gene = 0; nth_gene < num_genes; ++nthgene)
{
cudaMemcpy(genomes_buffer + nth_gene,
src + needed_genome_idx + nth_gene * stride_size, // stride_size being a big number, usually equal to the size of the GA population.
sizeof(float),
cudaMemCpyDeviceToDevice);
}

这是可行的解决方案吗?使用 cudaMemCpyAsync 会有助于提高性能吗?

是否有更好的方法,或者至少是更优雅的方法来执行此类内存操作?

最佳答案

你可以尝试写一个内核来完成shuffle,也许比调用cudaMemcpy那么多次效率更高。

关于c++ - 如何在设备内存中有效地随机播放数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18416362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com