我正在尝试使用Open-MP,C ++和管道方法并行化冒泡排序算法。以下代码对我有意义,但它确实无法正常工作。它只使用(Input_Size)/(Number_of_threads)对子数组进行排序。
“关键”关键字不会组织线程执行顺序,因此最终数组将被排序?我也尝试了“atomic”关键字,但它似乎不起作用,并且编译器不断返回以下错误invalid form of ‘#pragma omp atomic’ before ‘;’ token
例:阵列9 4 19 9 5 4 5 6 20 18,使用3个线程,给我阵列4 9 9 4 5 5 19 6 18 20。
#include <iostream>
#include <fstream>
#include <omp.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int *readFile(int num,ifstream &ifs)
{
int *array;
char charac[255];
if(ifs.good())
{
array = new int [num];
for(int i =0;i<num;i++)
{
ifs>>array[i];
//cout<<array[i]<<endl;
}
}
return array;
}
void bubbleP(int *a,int size,int nT)
{
int slice = size/nT;
#pragma omp parallel num_threads(nT)
{
int index = omp_get_thread_num();
int temp;
for(int i=0; i<=size; i++)
{
for(int j=index*slice; j<(index+1)*slice; j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
#pragma omp atomic
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("Thread number: %d\n\n", index);
}
if (size <= 30)
{
for(int i=0;i<tam;i++)
printf("Array: %d\n", a[i]);
}
return;
}
int main(int argc, char **argv)
{
int *a;
int size;
ifstream ifs;
ifs.open(argv[1]);
int nThreads = atoi(argv[2]);
ifs>>size;
printf("Reading file: %s\n", argv[1]);
a = readFile(size,ifs);
bubbleP(a,size,nThreads);
return 0;
}