C++ CUDA-检查重复值并添加两个值
我有两组数组C++ CUDA-检查重复值并添加两个值,c++,arrays,cuda,thrust,C++,Arrays,Cuda,Thrust,我有两组数组 a1 a2 a3 a4 a5 a6 a7 a8 <= name it as key1 b1 b2 b3 b4 b5 b6 b7 b8 <= val1 c1 c2 c3 c4 c5 c6 c7 c8 作为第一个数组,我计算1,2,3,4,5,6,7 2 1 1 0 1 1 1 <=name it as count 我担心的是,由于并非所有线程都是相等的,这将导致偏差,并且我可能没有有效的性能。您可以将数据视为两个键值表。表1:(a,b)->c和表2:(d,e)-
a1 a2 a3 a4 a5 a6 a7 a8 <= name it as key1
b1 b2 b3 b4 b5 b6 b7 b8 <= val1
c1 c2 c3 c4 c5 c6 c7 c8
作为第一个数组,我计算1,2,3,4,5,6,7
2 1 1 0 1 1 1 <=name it as count
我担心的是,由于并非所有线程都是相等的,这将导致偏差,并且我可能没有有效的性能。您可以将数据视为两个键值表。表1:
(a,b)->c
和表2:(d,e)->f
,其中对(a,b)
和(d,e)
是键,而c
,f
是值
那么你的问题就简化为
foreach key in Table2
if key in Table1
Table2[key] += Table1[key]
假设a
和b
的范围有限且为正,例如无符号字符
,将a
和b
组合成一个键的简单方法是
unsigned short key = (unsigned short)(a) * 256 + b;
如果键
的范围仍然不像上面的示例中那样大,您可以创建表1
,如下所示
int Table1[65536];
检查表1
中的键是否变为
if (Table1[key] != INVALID_VALUE)
....
有了所有这些限制,带推力的实现应该非常简单
如果a
和b
具有更大的范围,如int
,则仍然可以使用类似的组合方法
但是如果key
的范围太大,您必须使用Robert Crovella建议的方法。您可以将数据视为两个键值表。表1:(a,b)->c
和表2:(d,e)->f
,其中pair(a,b)
和(d,e)
是键,而c
,f
是值
那么你的问题就简化为
foreach key in Table2
if key in Table1
Table2[key] += Table1[key]
假设a
和b
的范围有限且为正,例如无符号字符
,将a
和b
组合成一个键的简单方法是
unsigned short key = (unsigned short)(a) * 256 + b;
如果键
的范围仍然不像上面的示例中那样大,您可以创建表1
,如下所示
int Table1[65536];
检查表1
中的键是否变为
if (Table1[key] != INVALID_VALUE)
....
有了所有这些限制,带推力的实现应该非常简单
如果a
和b
具有更大的范围,如int
,则仍然可以使用类似的组合方法
但是,如果键的范围过大,您必须使用Robert Crovella建议的方法。这几乎是重复的。有一个双键向量会让它变得更复杂,但如果我们能保证第二个子键向量的顺序与主键向量的顺序相同,那就没什么了。谢谢你的评论。遗憾的是,无法保证排序。您可以强制排序(即重新排序重复项,因此子密钥已排序)。否则,您将返回蛮力搜索(至少在一个重复的密钥内),这将大大降低效率。它几乎是一个副本。有一个双键向量会让它变得更复杂,但如果我们能保证第二个子键向量的顺序与主键向量的顺序相同,那就没什么了。谢谢你的评论。遗憾的是,无法保证排序。您可以强制排序(即重新排序重复项,因此子密钥已排序)。否则,您将返回蛮力搜索(至少在重复密钥内),这将大大降低效率。