并行化 - BubbleSort Open-MP C ++

时间:2017-04-10 19:29:51

标签: c++ multithreading sorting parallel-processing openmp

我正在尝试使用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;
}

0 个答案:

没有答案