如何在cuda中创建大位数组?

时间:2012-06-14 23:38:14

标签: cuda bitarray

我需要在我的算法中跟踪大约10000个数组元素。为此,我需要每个记录的布尔值。如果我使用char数组来跟踪10000个数组(为0/1),则需要很多记忆。

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

1 个答案:

答案 0 :(得分:1)

正如Roger所说,答案是肯定的,CUDA提供与正常C相同的按位操作(即>><<&),因此您可以基本上正常地实现位数组(差不多,请参阅下面的线程同步问题。)


然而,对于你的情况来说,几乎肯定不是一个好主意。

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

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

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