我实现了一种使用排序的算法。我尝试使用Thrust :: sort_by_key大约需要0.4秒来对具有10 ^ 7个元素的数组进行排序。
我认为bitonic排序网络应该比Thrust :: sort_by_key更快。然而,bitonic排序需要大约2.5秒才能对上面提到的相同阵列进行排序。我使用了SDK提供的bitonic排序网络。我刚刚修改了原来的bitonic排序。
你可以告诉我为什么吗?或者给我一些建议?谢谢,
益
2011年8月15日
答案 0 :(得分:3)
简短的回答是,CUDA SDK提供的bitonic排序示例主要是教学法。它不像Thrust的排序实现那样优化,它基于Merrill提供的非常有效的基数排序。
两种算法的asymptotic performance也不同。 Bitonic排序网络具有O(n lg^2 n)
复杂度,而Thrust使用的基数排序更像O(#bits n)
复杂度,其中#bits
表示表示输入数据所需的位数。换句话说,基数排序要求渐近排序的全局内存读取和写入比渐近排序少。
您可能会发现,对于较小的工作负载,bitonic排序的效果会更好。