如何使用CUDA减少二进制搜索的分支差异

时间:2012-04-30 19:19:05

标签: algorithm cuda gpu gpgpu gpu-programming

应用程序将交叉两个排序的整数列表(设置交集),比如list1和list2。

list1的每个元素都将被分配一个GPU线程,并进行二进制搜索以检查它是否出现在list2中。很容易看出这个应用程序中存在大量的线程差异。我想知道是否有任何好的方法来减少线程差异。我正在使用CUDA来实现此应用程序。

我知道有一种称为P-ary搜索的方法,但我的任务是减少二进制搜索的线程差异。我也知道有一个名为推力的库,但似乎没有尝试减少分歧。

2 个答案:

答案 0 :(得分:2)

如果两个列表都已排序,则二进制搜索不是您可以执行的最佳算法。二进制搜索会给O(n lg n),但只做一个类似合并的算法,只进行交叉,O(n)

这是一个使用GPU的愚蠢算法。我看到的唯一情况是你刚刚在GPU中生成了数据。在这种情况下,您希望将问题分解为一堆较小的交叉点,并为每个交叉点分配一个线程。

为此,选择list {1}}等间隔的元素,并使用二分查找在list2中找到它们。同样,选择list {的k等间距元素,并在list1中找到它们。您现在每个列表中都有k个范围,其中每个范围最多包含2k个元素。现在并行地与这些范围相交。 (将N/k设置为所需线程数的一半。)

答案 1 :(得分:2)

可信代码:

    bool end = false;
    bool found = false;

    while(!end && !found)
    {
            int diff        = max-min;
            int middle      = min + (diff / 2);

            end             = diff < 1;
            found           = element[middle] == element;
            if (index < elements[middle])
                    max = middle-1;
            else //(index > elements[middle+1])
                    min = middle + 2;
    }
    return found;

警告:此代码可能会通过访问超出范围的内存

生成异常