【问题标题】:Parallel Selection sort with multithreading多线程并行选择排序
【发布时间】:2021-05-21 05:41:45
【问题描述】:

我有选择排序功能

inline void selection_sort(double* arrayPtr, int length_array)
{
    for (auto i = 0; i < length_array; i++)
    {
        for (auto j = i + 1; j < length_array; j++)
        {
            if (arrayPtr[i] > arrayPtr[j])
            {
                std::swap(arrayPtr[i], arrayPtr[j]);
            }
        }
    }
}

如何用多线程对其进行优化?

我找到了仅用于快速排序的解决方案,但这些解决方案对我没有帮助。

【问题讨论】:

    标签: c++ multithreading performance parallel-processing selection-sort


    【解决方案1】:

    免责声明:这仅适用于家庭作业要求。出于所有实际目的,std::sort 更好。

    假设要求是必须执行精确的一组操作,可以以任何顺序执行独立操作。

    注意:

    • length_array 通过数组(由i 索引)
    • 每个通道都必须按顺序完成。
    • 但是,请注意(非正式地)第二遍的前半部分独立于第一遍的后半部分,只要完成第一遍的前半部分,两者都可以按任何顺序完成。李>

    因此,解决问题的一种可能方法是(非常小心偏移错误,您必须弄清楚细节)

    • 让线程 1 处理第一遍的前半部分。
    • 等待两个线程完成当前步骤。
    • 让线程 1 处理第一轮的后半部分,而线程 2 并发处理第二轮的前半部分。
    • 等待两个线程完成当前步骤。
    • 让线程 1 处理第二轮的后半部分,而线程 2 并发处理第三轮的前半部分。
    • 等待两个线程完成当前步骤。
    • 重复。
    • 特殊情况最后一遍。
    • 以某种方式处理偏移量。

    【讨论】:

      【解决方案2】:

      如何使用多线程对其进行优化?我找到的解决方案仅适用于 快速排序,但这些解决方案对我没有帮助。

      您找不到太多关于它的信息,因为这样做不是一个好主意。这不会是有效的,选择排序的并行化与insert sort 的并行化有一些相同的问题。即这段代码:

      for (auto i = 0; i < length_array; i++)
      {
          for (auto j = i + 1; j < length_array; j++)
          {
              if (arrayPtr[i] > arrayPtr[j])
              {
                  std::swap(arrayPtr[i], arrayPtr[j]);
              }
          }
      }
      

      由于与内循环的相互依赖关系,您无法有效地并行化外循环。因此,您已经受限于并行任务的数量及其粒度。那么你在交换阶段就会遇到数据依赖问题,你也需要解决这个问题,这也会影响并行版本的加速。

      像合并排序这样的算法更可并行化它们的并行化产生更好的加速),因为它们具有分而治之的性质,可以并行化递归来电。

      尽管如此,您可以在 stackoverflow 中找到 OpenMP/C++ 中选择排序的并行版本。话虽如此,代码运行是并行的,但我怀疑没有太多(如果有的话)加速。

      【讨论】:

        猜你喜欢
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2011-07-01
        • 2021-04-01
        • 2016-04-07
        相关资源
        最近更新 更多