在OpenMP上的并行合并排序上的数组大小问题.如何将合并分类分类为更多任务
Array size problem on a parallelized Merge Sort on OpenMP. How can I divide a merge sort on more tasks?
我正在使用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);
}
您对middleLeft
和middleright
中mergeSort
中的计算是错误的,并且可以在[left
,right
]范围之外给出值。例如,如果left
为20,并且right
为30,则middle
为25,middleLeft
12和middleRight
18。
您想做的是:
middleLeft = left + (right - left) / 4;
middleRight = left + 3 * (right - left) / 4;
相关文章:
- 使用C++程序合并排序没有得到正确的输出
- 用于合并排序的合并函数
- 在声明中合并两个常量"std::set"(不是在运行时)
- 如何将一个数组值合并为一个整数c++
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 将向量的 N 段合并到位C++
- 在C++中合并两个库
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 以迭代方式合并标准::unordered_map
- 更改 C++ 中的组合分类变量
- 无法合并生成操作.. 先决条件不同
- 合并排序不排序自创建数组类 c++
- 合并文本文件不同行中的重复项
- 找不到标识符合并
- 只有级联分类器会发出未定义的引用错误
- 仅在大型阵列上出现合并排序分段错误
- C++ 合并字符串以'system'函数错误
- 合并,分类和删除重复分类的向量和未分类的向量
- 在OpenMP上的并行合并排序上的数组大小问题.如何将合并分类分类为更多任务
- 在制作合并分类项目C 的第三个对象时,请堆叠溢出