应用程序将交叉两个排序的整数列表(设置交集),比如list1和list2。
list1的每个元素都将被分配一个GPU线程,并进行二进制搜索以检查它是否出现在list2中。很容易看出这个应用程序中存在大量的线程差异。我想知道是否有任何好的方法来减少线程差异。我正在使用CUDA来实现此应用程序。
我知道有一种称为P-ary搜索的方法,但我的任务是减少二进制搜索的线程差异。我也知道有一个名为推力的库,但似乎没有尝试减少分歧。
答案 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;
警告:此代码可能会通过访问超出范围的内存
生成异常