我有一个输入数组,它被传递给了一个内核。每个线程都处理数组的一个值,并根据规则更改该值或不更改。
之后我想很快找出输入内存中是否有任何更改,在这种情况下,我希望能够快速找到更改发生的位置(即输入数组的索引)。
我考虑使用类似于位数组的东西。位的总数将等于线程的总数。每个线程只会操作一个位,因此最初位设置为false,如果线程更改相应的输入值,则位将变为true。
为了使其更加清晰,假设我们有一个名为
位数组应该如下所示:
因此,最终的二进制数组将是:
我不想使用一个
之后我想很快找出输入内存中是否有任何更改,在这种情况下,我希望能够快速找到更改发生的位置(即输入数组的索引)。
我考虑使用类似于位数组的东西。位的总数将等于线程的总数。每个线程只会操作一个位,因此最初位设置为false,如果线程更改相应的输入值,则位将变为true。
为了使其更加清晰,假设我们有一个名为
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位。但是,如果两个线程想要更改数组的第一个字符的不同位,则它们必须以原子方式进行操作,即使位内部的更改将发生在不同的位置。因此,使用原子操作可能会破坏并行性,在这种情况下,使用原子操作是没有必要的,但由于使用 char 数组而不是像 std::bitset 这样的更专业的东西的限制,必须使用原子操作。
预先感谢您。
std::bitset
的东西。对我来说,使用bool
数组不是一个好主意,因为我不能在GPU上使用太多内存。 - ksm001