Parallel processing 如何:使用OpenMP进行双音排序
我是openmp的新手,我有一个学校作业。我认为问题出在bitonicMerge。我一直在尝试很多变化和可能性,我发现的“最佳解决方案”如下:Parallel processing 如何:使用OpenMP进行双音排序,parallel-processing,openmp,Parallel Processing,Openmp,我是openmp的新手,我有一个学校作业。我认为问题出在bitonicMerge。我一直在尝试很多变化和可能性,我发现的“最佳解决方案”如下: `void sort() { #pragma omp parallel { #pragma omp single recBitonicSort(0, N, ASCENDING); } } void recBitonicSort(int lo, int cnt, int dir) { if (cnt>1) {
`void sort() {
#pragma omp parallel
{
#pragma omp single
recBitonicSort(0, N, ASCENDING);
}
}
void recBitonicSort(int lo, int cnt, int dir) {
if (cnt>1) {
int k=cnt/2;
#pragma omp task if(cnt>1024) // elements vary from 2^12 to 2^24
recBitonicSort(lo, k, ASCENDING);
#pragma omp task if(cnt>1024)
recBitonicSort(lo+k, k, DESCENDING);
#pragma omp taskwait
bitonicMerge(lo, cnt, dir);
}
}
void bitonicMerge(int lo, int cnt, int dir) {
if (cnt>1) {
int k=cnt/2;
int i;
#pragma omp parallel num_threads(p)
{
#pragma omp for schedule(static) nowait
for (i=lo; i<lo+k; i++)
{
//printf("Num of threads: %d\n", omp_get_num_threads());
compare(i, i+k, dir);
}
#pragma omp single
{
#pragma omp task if(cnt>1024)
bitonicMerge(lo, k, dir);
#pragma omp task if(cnt>1024)
bitonicMerge(lo+k, k, dir);
}
}
}
}`
`void sort(){
#pragma-omp并行
{
#布拉格omp单曲
重新排序(0,N,升序);
}
}
void recBitonicSort(int-lo、int-cnt、int-dir){
如果(cnt>1){
int k=cnt/2;
#pragma omp task if(cnt>1024)//元素在2^12到2^24之间变化
循环排序(lo、k、升序);
#pragma omp任务如果(cnt>1024)
循环排序(lo+k,k,递减);
#pragma omp taskwait
bitonicMerge(lo,cnt,dir);
}
}
void bitonicMerge(int-lo、int-cnt、int-dir){
如果(cnt>1){
int k=cnt/2;
int i;
#pragma omp并行数线程(p)
{
#计划(静态)nowait的pragma omp
用于(i=lo;i1024)
双向合并(lo、k、dir);
#pragma omp任务如果(cnt>1024)
比特合并(lo+k,k,dir);
}
}
}
}`
代码可以工作,但需要花费时间(命令式bitonic需要0.5s,递归需要7-8s,元素=2^20,最大线程=8)。我知道printf只打印1个线程,可能是因为recBitonicSort为bitonicMerge分配了一个线程,但我找不到更好的解决方案。你的问题是?我的bitonicMerge怎么了…?你的问题是?我的bitonicMerge怎么了。。。?