gpt4 book ai didi

c++ - OpenMP 上并行合并排序的数组大小问题。如何在更多任务上划分合并排序?

转载 作者:行者123 更新时间:2023-11-28 01:21:22 28 4
gpt4 key购买 nike

我正在使用 OpenMP 进行并行研究。我正在尝试将 MergeSort 划分为多个任务以获得更好的结果。

我已经用任务完成了它,但现在我试图在每次迭代中分配更多任务,所以我可以使用更多的 CPU(在我的原始代码中,我每次递归使用大约 1.5 个 CPU ).

所以我将 Mergesort 分为四次而不是每次递归两次调用,但我收到错误的数组长度错误:

terminate called after throwing an instance of 'std::bad_array_new_length'
what(): std::bad_array_new_length
Abortado (imagem do núcleo gravada)

我的代码在下面,用 C++ 编写

#include<iostream>
#include<fstream>
#include<algorithm>
#include "omp.h"
using namespace std;

int n = 10000;
int * Vet = new int [10000];
double startTime, stopTime;

void generate_list(int * x, int n) {
int i,j,t;
for (i = 0; i < n; i++)
x[i] = i;
for (i = 0; i < n; i++) {
j = rand() % n;
t = x[i];
x[i] = x[j];
x[j] = t;
}
}

void merge(int aux[], int left, int middle, int right){
int * temp = new int [middle-left+1];
int * temp2 = new int[right-middle];
for(int i=0; i<(middle-left+1); i++){
temp[i]=aux[left+i];
}
for(int i=0; i<(right-middle); i++){
temp2[i]=aux[middle+1+i];
}
int i=0, j=0, k=left;
while(i<(middle-left+1) && j<(right-middle))
{
if(temp[i]<temp2[j]){
aux[k++]=temp[i++];
}
else{
aux[k++]=temp2[j++];
}
}
while(i<(middle-left+1)){
aux[k++]=temp[i++];
}
while(j<(right-middle)){
aux[k++]=temp2[j++];
}
}

void mergeSortSerial(int aux[], int left, int right){
if (left < right){
int middle = (left + right)/2;
mergeSortSerial(aux,left,middle); //call 1
mergeSortSerial(aux,middle+1,right); //call 2
merge(aux,left,middle,right);
}
}

void mergeSort (int aux[], int left, int right){
if (left < right){
if ((right-left) > 1000){
int middle = (left+ right)/2;
int middleleft = (left + right)/4;
int middleright = right-middleleft;
#pragma omp task firstprivate (aux)
mergeSort(aux,left,middleleft); //call 1
#pragma omp task firstprivate (aux)
mergeSort(aux,middleleft+1,middle); //call 2
#pragma omp task firstprivate (aux)
mergeSort(aux,middle+1,middleright); //call 3
#pragma omp task firstprivate (aux)
mergeSort(aux,middleright+1,right); //call 4
#pragma omp taskwait
merge(aux,left,middleleft,middle);
merge(aux,middle+1,middleright,right);
merge(aux,left,middle,right);
} else{mergeSortSerial(aux, left, right);}
}
}

void print(int aux[], int n)
{
for(int i=0; i<n; i++)
cout<<aux[i]<<" ";
cout<<endl;
}



int main(){
generate_list(Vet, n);
omp_set_nested(1);
omp_set_num_threads(4);
//startTime = clock();

#pragma omp parallel
{
#pragma omp single
mergeSort(Vet, 0, n-1);
}
cout<<is_sorted(Vet,Vet+n)<<endl;
return(0);
}

最佳答案

您在 mergeSort 中对 middleLeftmiddleright 的计算是错误的,并且可以给出 [left 之外的值, ]范围。例如,如果 left 为 20,right 为 30,则 middle 将为 25,middleLeft 为 12,并且middleRight 18.

你想要做的是:

middleLeft = left + (right - left) / 4;
middleRight = left + 3 * (right - left) / 4;

关于c++ - OpenMP 上并行合并排序的数组大小问题。如何在更多任务上划分合并排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56121569/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com