gpt4 book ai didi

c++ - 如何使用 C++ Cuda 高效地实现并行笛卡尔积

转载 作者:行者123 更新时间:2023-12-02 18:18:04 33 4
gpt4 key购买 nike

我有两个数组 A 和 B,分别有 m 和 n 个 int 变量。我有一个函数 f,我想生成所有 f(a, b),其中 a 在 A 中,b 在 B 中:

A = {a1, a2, a3, ...., am}
B = {b1, b2, b3, ...., bn}

C = f(A * B) = {f(a1,b1), f(a1,b2), f(a1,b3), ..., f(a1, bn),
f(a2,b1), f(a2,b2), f(a1,b3), ..., f(a2, bn),
...
f(am,b1), f(am,b2), f(am,b3), ..., f(am, bn)}

更准确地说,我的函数 f 是数字之间的简单按位或,但我想一般性地问它。此外,结果中项目的顺序并不重要。我只想从 A 和 B 生成所有可能的对。

由于我需要生成并存储结果,如何高效地实现(使用C++ Cuda)以减少访问全局内存的次数?我需要使用共享内存吗?

任何建议都将不胜感激。

最佳答案

例如,这个想法是在大小为 32x32 的线程 block 上进行操作。对于(i, j)位置处的每个线程 block ,a[i:i+32]可以被当前线程中的一部分加载到共享内存中。堵塞。同样的情况也适用于 b[j:j+32]。然后,所有线程都可以计算 f(shared_a[thread_i], shared_b[thread_j]),其中 shared_ashared_b 是之前加载的值共享内存,thread_ithread_j是当前 block 中线程的索引。

为了获得更好的性能,线程 block 可以计算许多大小为 32x32 的紧密 block 。例如,32x32 的线程 block 可以计算大小为 32x32 的 4x4 打包 block (产生 128x128 项)。这个想法是在共享内存中加载更多值,从而减少重新加载的次数。

话虽如此,节点在内存中写入C矩阵将非常昂贵,这肯定会使之前的所有优化变得毫无值(value)。即时计算需要 C 的操作应该是一个好主意。

关于c++ - 如何使用 C++ Cuda 高效地实现并行笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71271909/

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