有效地评估CUDA中的索引映射函数

时间:2014-11-20 12:12:19

标签: c++ cuda gpgpu gpu-programming

在CUDA内核中,我需要找到一个映射到threadIdx的密钥。

映射可能如下所示:

  

键 - > threadIdx

     

0 - > {0,1,2,3,4}

     

1 - > {5,6,7}

     

2 - > {8,9,10}

     

...

每个密钥k_i都映射到n_i(变量,n_in_i>0个线程。 该键将用于检索全局数组中的相应值。然后,此值将用于此内核中的后续计算中。

映射可以绘制为分段常数函数:

example of mapping function

键的数量不限于3(这只是一个例子!)并且仅在运行时已知,以及相应的"宽度"每把钥匙。

如何有效地找出CUDA内核中的相应密钥? 我想到了以下两种选择:

  1. 在内核中使用二进制搜索(内存效率高)

  2. 预先计算每个threadIDx的映射,然后启动内核(运行时效率)

      

    0 0 0 0 0 1 1 1 2 2 2 ...

  3. 有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

还有另一种算法可以在内存和运行时效率方面为您提供中位数: 假设线程总数为N。让我们接近M的数字sqrt(N),并将所有线程分成M个线程组(最后一个将不完整)。现在,仅为每个组中的第一个线程预先计算密钥(其idxes将为0M2M等等。它为我们提供了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找到它自己的密钥并将其存储在数组中。