使用指定数量的线程进行并行基数排序
Parallel radix sort using a provided number of threads
我在理解使用线程的并行基数排序的概念时遇到了一些困难。
如果我们使用最高有效数字方法,我们可以从创建桶1到9开始,并使用它们的MSD将数字分成桶。
您可以通过每个bucket有一个线程来并行排序。
然而,如果我们必须使用给定数量的处理器,例如4,您将如何将这9个桶分成4个处理器?
我在网上看到的一个图表似乎表明,您应该首先将数字划分为x个处理器的x个分区(不做任何排序),然后每个处理器对其给定分区的所有数字进行排序。但你会得到x个数字桶,每个数字桶各自排序,但不是整个数字向量/数组排序,我不确定你接下来会做什么。
在对x分区进行排序之后,您将合并x分区。这可以通过log2(x)次进行2向归并,也可以通过单次进行x向归并。x方式合并通常使用堆来加速确定x个元素(以及元素所属的分区)中哪个最小。除了初始化之外,每次只从堆中移除一个元素并将其添加到堆中。最终到达x个分区之一的终点,合并就变成了x-1合并。最后只剩下一个分区,并将其复制到输出数组中。
如果数组太大,它的分区比内核特定的L1和L2缓存大得多,由于冲突,并行基数排序不会有太大帮助,因为所有内核共享公共L3(如果存在的话,还有L4)缓存和主存。例如,每个核心的L1缓存可能是32KB,每个核心的L2缓存可能是256KB。
另一种方法是将数组分成z个256KB的分区,然后对z个分区一次执行x个基数排序。最后一步是对z排序的256KB分区进行z向合并。
对于基数排序,您可能希望对8位字段使用进制256而不是进制10(您可以通过移位而不是分割来将元素拆分为多个字段)。
相关文章:
- 并行块(线程清理器)之外的 OpenMP 中的争用条件;误报?
- System Verilog DPI - 在 cpp 中运行并行线程,在 SV 中运行另一个并行线程
- 是否可以限制C++17并行"for_each"的线程数
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- 如何从多个线程并行安全地访问和写入复杂容器?
- 查询时间/周期是针对所有内核/线程的序列化请求还是并行请求?
- 如何在新的 C++17 并行算法中管理线程?
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 使用 vector<thread> 和 .join() 未并行运行的多线程C++程序
- 最大线程数 - 如何确定C++线程是否并行运行?
- C 多线程,在并行多个线程时获得SegFault
- FFmpeg:使用自定义线程池进行并行编码
- OpenMP 并行编程基于线程数与执行时间的关系
- 为什么在某些特定情况下具有多个线程(并行处理)会降低性能
- 使用C 中的线程并行计算
- Windows 线程:并行合并排序
- 使用哪个线程并行接口来使用堆栈进行任务共享和拆分
- 我如何在不同的核心上运行4个线程(并行)
- 调度大量线程,因此只有4个线程并行执行
- 从 Java 的多线程并行调用非线程安全的 DLL 函数