【问题标题】:How to convert merge sort to parallel merge sort如何将归并排序转换为并行归并排序
【发布时间】:2017-11-25 17:39:20
【问题描述】:

这就是我目前所拥有的,常规合并排序可以完美运行,但我不确定我为使用 openMP 进行的并行合并排序所做的是否正确。目标是通过将 openMP 合并到其中并使用从一类应用程序中获取的数据来优化合并排序。对于获取的数据,我认为我会将其设为线程,因为使用多个线程应该会更好地优化它。关于我应该在哪里实现线程的任何建议或提示?

void mergeSort(int arr[], int start, int end) 
{
    if(start < end) 
    {
        int middle = (start + end) / 2;
        /* sort left half */
        mergeSort(arr, start, middle);
        /* sort right half */
        mergeSort(arr, middle + 1, end);
        /* merge the two halves */
        merge(arr, start, end);
    }
}

void mergesort_parallel_omp(int a[], int start, int end)//parallelized version
{                                    
    int threads = 2;
    if(start < end) 
    {
        int middle = (start + end) / 2;
        omp_set_nested(1);                               /////
        omp_set_num_threads(threads);
        #pragma omp parallel sections
        {
            #pragma omp section
                mergesort_parallel_omp(a, start, middle);
            #pragma omp section
                mergesort_parallel_omp(a, middle + 1, end);
        }
        merge(a, start, end);
    }  
}

【问题讨论】:

标签: c++ sorting openmp


【解决方案1】:

参考this文档,你需要使用omp_set_nested,如链接所示。要具有并行性,请在您已完成 #pragma omp parallel sections 的地方声明它,并且不要忘记设置 OMP_NUM_THREADS

【讨论】:

  • 所以把“omp_set_nested()”放在“#pragma omp parallelsection”上面,omp_num_threads()应该设置在哪里?
  • 该链接似乎已经过时了,并且带有不相关的专有扩展。请改用official specification。除了这个问题是一个清晰且容易找到重复的stackoverflow.com/questions/13811114/…
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2014-08-12
  • 2012-01-31
  • 1970-01-01
  • 2014-04-08
  • 2020-04-22
  • 2016-04-14
  • 2015-06-17
相关资源
最近更新 更多