我有两组数组
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,...,an
和d1,...,dn
已排序,可能会重复。即他们的值可能类似于1 1 2 3 4 6 7 7 7 ...
我想检查每个元组di,ei
是否等于ai,bi
中的任何一个。{1}}。如果是(di==ai,bi==ei
),那么我必须使用某些功能组合fi
和ci
,例如添加并存储在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;
我担心的是,由于并非所有线程都相同,这将导致扭曲分歧,并且我可能没有高效的性能。
答案 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 char
和a
合并为一个键的简单方法是
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建议的方法。