Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何使用open mp在n个处理器之间划分n个数字_Sorting_Parallel Processing_Openmp - Fatal编程技术网

Sorting 如何使用open mp在n个处理器之间划分n个数字

Sorting 如何使用open mp在n个处理器之间划分n个数字,sorting,parallel-processing,openmp,Sorting,Parallel Processing,Openmp,我被分配了一项任务,在并行编程中执行机组排序。作为第一步,我有一个大小为n和n的处理器阵列,我需要在n个处理器之间划分这些元素,并按顺序对每个部分进行排序,然后将它们合并回来,我如何在openmp中做到这一点。我不熟悉使用openmp,所以任何解决这个问题的资源都会很有帮助。这是我从脑后写的。它可能不是最优的,也没有经过测试。但它应该给你一个如何处理这样一个问题的方向 #包括 #包括 #包括 ptrdiff\u t min(ptrdiff\u t a,ptrdiff\u t b){ 返回((a>

我被分配了一项任务,在并行编程中执行机组排序。作为第一步,我有一个大小为n和n的处理器阵列,我需要在n个处理器之间划分这些元素,并按顺序对每个部分进行排序,然后将它们合并回来,我如何在openmp中做到这一点。我不熟悉使用openmp,所以任何解决这个问题的资源都会很有帮助。

这是我从脑后写的。它可能不是最优的,也没有经过测试。但它应该给你一个如何处理这样一个问题的方向

#包括
#包括
#包括
ptrdiff\u t min(ptrdiff\u t a,ptrdiff\u t b){
返回((a>b)→b:a);
}
void in place_sequential_sort(双*数据,ptrdiff_t n){/*…*/}
无效就地合并(双*数据,ptrdiff_t n1,ptrdiff_t n2){/*…*/}
无效就地\u并行\u排序(双*数据,ptrdiff\u t n){
if(n<2)
返回;
/*为助手数组分配内存*/
int const max_threads=omp_get_max_threads();
ptrdiff_t*my_n=calloc(最大线程数,sizeof(*my_n));
如果(!my_n){/*…*/}
#pragma omp并行默认值(无)\
共享(n,数据,我的)
{
/*获取线程ID和实际线程数*/
int const tid=omp_get_thread_num();
int const N=omp_get_num_threads();
/*在线程之间分发数据*/
ptrdiff_t const max_elem_per_thread=((n+n-1)/n);
ptrdiff_t const my_begin=min(tid*max_elem_per_thread,n);
my_n[tid]=min(n-开始,每个线程的最大元素);
如果(我的[tid]>1)
就地排序(数据+我的开始,我的n[tid]);
/*合并已排序的数据段(并行简化算法)*/
对于(ptrdiff_t步长=1;步长

我假设你需要一个C解决方案(不是C++或FORTRAN),并对数据进行排序。这是一个非常基本的解决方案。OpenMP可以做更多的事情(例如任务)。必须提供inplace_sequantial_sort()和inplace_merge()函数。

是获取基础知识的非常好的资源。但不要什么都看。第2章、第4章和第5章对于初学者来说可能没有用处。这里还有一个使用openmp 5的版本