1

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

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

4

1 回答 1

1

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


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

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

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

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

于 2012-06-15T13:49:36.567 回答