在CUDA内核中,我需要找到一个映射到threadIdx的密钥。
映射可能如下所示:
键 - > threadIdx
0 - > {0,1,2,3,4}
1 - > {5,6,7}
2 - > {8,9,10}
...
每个密钥k_i
都映射到n_i
(变量,n_i
个n_i>0
个线程。
该键将用于检索全局数组中的相应值。然后,此值将用于此内核中的后续计算中。
映射可以绘制为分段常数函数:
键的数量不限于3(这只是一个例子!)并且仅在运行时已知,以及相应的"宽度"每把钥匙。
如何有效地找出CUDA内核中的相应密钥? 我想到了以下两种选择:
在内核中使用二进制搜索(内存效率高)
预先计算每个threadIDx的映射,然后启动内核(运行时效率)
0 0 0 0 0 1 1 1 2 2 2 ...
有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
还有另一种算法可以在内存和运行时效率方面为您提供中位数:
假设线程总数为N
。让我们接近M
的数字sqrt(N)
,并将所有线程分成M
个线程组(最后一个将不完整)。现在,仅为每个组中的第一个线程预先计算密钥(其idxes将为0
,M
,2M
等等。它为我们提供了O(sqrt(N))
个记忆渐近线。
现在,在内核中,我们可以轻松找到当前组(groupIdx = threadIdx / M
)和下一组(groupIdx + 1
)的索引。对于他们中的每一个,我们都知道预先计算的密钥key[groupIdx]
和key[groupIdx + 1]
。现在您可以执行BS,但可以使用[key[groupIdx]; key[groupIdx + 1]]
段进行搜索而不是[1; MAX_KEY_VALUES]
。
答案 1 :(得分:0)
你可以组合 - 每个线程在启动时,用BS找到它自己的密钥并将其存储在数组中。