在CUDA中模拟std :: bitset

时间:2013-05-19 11:38:19

标签: cuda bit gpu-programming bitset

我有一个给内核的输入数组。每个线程使用数组的一个值,并根据规则更改值或根本不更改它。

如果输入内存中有任何变化,我想很快发现,如果有的话,我希望很快找到发生这种变化的地方(输入数组的索引)。

我想过使用类似于数组的东西。位总数将等于线程总数。每个线程只会操作一个位,所以最初这些位将被设置为false,如果一个线程改变了相应的输入值,该位将变为真。

为了更清楚,让我们假设我们有一个名为A的输入数组

1 9 3 9 4 5

位数组将是以下

0 0 0 0 0 0

因此我们将有6个线程处理输入数组。我们假设最终的输入数组是

1 9 3 9 2 5

所以最后的位数组是:

0 0 0 0 1 0

我不想使用bool数组,因为每个值都占用1个字节的内存,这是因为我只想使用位来工作。

有可能实现这样的目标吗?

我想过创建一个char数组,其中数组的每个值都有8位。但是,如果两个线程想要更​​改数组第一个字符的不同位,该怎么办?他们必须原子地进行操作,即使位内的变化将在不同的位置。所以使用原子操作可能会破坏并行性,在这种情况下不需要使用原子操作,它没有任何意义,但是由于使用字符数组而不是更专业的限制而必须使用比如std::bitset

提前谢谢。

1 个答案:

答案 0 :(得分:3)

我正在提供这个问题的迟到答案,将其从未答复的清单中删除。

要执行您想要实现的目标,您可以定义长度为unsigned int的{​​{1}}数组,其中N/32是您要比较的数组的长度。然后你可以使用N来编写这样一个数组的每个位,这取决于数组的两个元素是否相等。

下面我提供一个简单的例子:

atomicAdd