Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA-检查重复值并添加两个值_C++_Arrays_Cuda_Thrust - Fatal编程技术网

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建议的方法。

这几乎是重复的。有一个双键向量会让它变得更复杂,但如果我们能保证第二个子键向量的顺序与主键向量的顺序相同,那就没什么了。谢谢你的评论。遗憾的是,无法保证排序。您可以强制排序(即重新排序重复项,因此子密钥已排序)。否则,您将返回蛮力搜索(至少在一个重复的密钥内),这将大大降低效率。它几乎是一个副本。有一个双键向量会让它变得更复杂,但如果我们能保证第二个子键向量的顺序与主键向量的顺序相同,那就没什么了。谢谢你的评论。遗憾的是,无法保证排序。您可以强制排序(即重新排序重复项,因此子密钥已排序)。否则,您将返回蛮力搜索(至少在重复密钥内),这将大大降低效率。