CUDA - 检查重复值并添加两个值

时间:2016-07-05 20:16:17

标签: 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

d1 d2 d3 d4 d5 d6 d7 d8 <= key2
e1 e2 e3 e4 e5 e6 e7 e8 <= val2
f1 f2 f3 f4 f5 f6 f7 f8

数组a1,...,and1,...,dn已排序,可能会重复。即他们的值可能类似于1 1 2 3 4 6 7 7 7 ...我想检查每个元组di,ei是否等于ai,bi中的任何一个。{1}}。如果是(di==ai,bi==ei),那么我必须使用某些功能组合fici,例如添加并存储在fi。

首先,是否可以使用zip迭代器和thurst库中的转换来有效地解决这个问题?

其次,我能想象的最简单的方法是计算每个键的数量的出现(ai)做前缀sum并使用两者来获取每个键的开始和结束索引然后对于每个di使用以上计数到迭代这些索引并检查是否ei==di。并进行转型。

即。如果我有

1 1 2 3 5 6 7
2 3 4 5 2 4 6
2 4 5 6 7 8 5

作为第一个数组,我计算出1,2,3,4,5,6,7,...:

的出现次数
2 1 1 0 1 1 1 <=name it as count

然后做前缀sum得到:

2 3 4 4 5 6 7  <= name it as cumsum

并使用它来做:

for each element di,
    for i in (cumsum[di] -count[di]) to cumsum[di]:
        if ei==val1[i] then performAddition;

我担心的是,由于并非所有线程都相同,这将导致扭曲分歧,并且我可能没有高效的性能。

1 个答案:

答案 0 :(得分:2)

您可以将数据视为两个键值表。表1:(a,b) -> c和表2:(d,e)->f,其中对(a,b)(d,e)是键,{{{ 1}},c是值。

然后您的问题简化为

f

假设foreach key in Table2 if key in Table1 Table2[key] += Table1[key] a的范围有限并且是正数,例如b,将unsigned chara合并为一个键的简单方法是

b

如果unsigned short key = (unsigned short)(a) * 256 + b; 的范围仍然不像上例中那么大,您可以将key创建为

Table1

检查int Table1[65536]; 中的key是否变为

Table1

有了所有这些限制,推力的实施应该非常简单。

如果if (Table1[key] != INVALID_VALUE) .... a的范围更大,例如b,则仍然可以使用类似的组合方法。

但是如果int的范围太大,你必须采用Robert Crovella建议的方法。