2017-11-25 194 views
0

这是迄今为止我所知道的常规合并排序完美工作,但我不确定我为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); 
    } 
} 
+0

[Parallel Merge-Sort in OpenMP]的可能重复(https://stackoverflow.com/questions/13811114/parallel- merge-sort-in-openmp) – Zulan

回答

0

参考this文档,则需要使用omp_set_nested如图所示的链接。为了有平行性,在你已经完成的地方声明#pragma omp parallel sections并且也不要忘记设置OMP_NUM_THREADS

+0

因此,在“#pragma omp parallel sections”上面加上“omp_set_nested()”,omp_ num_threads()应该设置在哪里? – user6088127

+0

该链接看起来非常过时,并且被无关专有扩展加入。请改用[官方说明](http://www.openmp.org/specifications/)。除了这个问题是一个明确和容易找到重复https://stackoverflow.com/questions/13811114/parallel-merge-sort-in-openmp – Zulan