【问题标题】:Bitonic Sorting Network vs Thrust::sort_by_key双调排序网络 vs Thrust::sort_by_key
【发布时间】:2011-10-27 02:01:44
【问题描述】:
我实现了一个使用排序的算法。我尝试了 Thrust::sort_by_key 大约需要 0.4 秒来对包含 10^7 个元素的数组进行排序。
我认为双音排序网络应该比 Thrust::sort_by_key 更快。但是,双调排序需要大约 2.5 秒才能对上述相同的数组进行排序。我使用了 SDK 提供的双音排序网络。我只是稍微修改了原来的双音排序。
你能告诉我为什么吗?或者给我一些建议?
谢谢,
呸
2011 年 8 月 15 日
【问题讨论】:
标签:
sorting
cuda
thrust
sorting-network
【解决方案1】:
简短的回答是 CUDA SDK 提供的双音排序示例主要用于教学。它根本不如 Thrust 的排序实现优化,后者基于 Merrill 提供的非常有效的基数排序。
两种算法的asymptotic performance也不同。双调排序网络的复杂度为O(n lg^2 n),而Thrust 使用的基数排序的复杂度更像O(#bits n),其中#bits 表示表示输入数据所需的位数。换句话说,基数排序比双调排序需要的全局内存读写次数渐进地少。
您可能会发现,对于较小的工作负载,双调排序表现更好。