如何在 cuda 中创建大位数组



我需要在我的算法中跟踪数组的大约 10000 个元素。因此,为此,我需要为每条记录提供布尔值。如果我使用 char 数组来跟踪 10000 个数组(作为 0/1),它会占用大量内存。

那么我可以在 Cuda 中创建一个 10000 位的位数组,其中每个位代表相应的数组记录吗?

正如罗杰所说,答案是肯定的,CUDA 提供了相同的按位运算(即 >><<& ) 作为普通 C,因此您可以基本上正常地实现位数组(几乎,请参阅下面的线程同步问题)。


但是,对于您的情况,这几乎肯定不是一个好主意。

线程同步存在问题。想象一下,GPU 上的两个线程正在反转数组单个条目的两个位。每个线程将从内存中读取相同的值,并对其应用其操作,但最后将其值写回内存的线程将覆盖另一个线程的结果。(注意:如果您的位数组未被 GPU 代码修改,那么这不是问题。

而且,除非明确要求,否则您不应该针对内存使用进行优化,具有 10K 元素的数组根本不会占用太多内存:即使您将每个布尔值存储在 64 位整数中,它也只有 80 KB。显然,您可以将它们存储在较小的数据类型中。(只有当你得到超过数千万甚至数亿个元素时,你才应该开始担心尽可能多地压缩数组。

此外,GPU 的工作方式意味着您可以通过为每个布尔值(很可能是 32 位布尔值)使用相当大的数据类型来获得最佳性能,例如,内存合并效果更好。(我还没有测试过这个断言,你需要运行一些基准来检查它。

最新更新