Общий массив MPI C ++ - PullRequest
       46

Общий массив MPI C ++

1 голос
/ 28 сентября 2019

Я хотел бы использовать общий массив в программе MPI.Мне нужно изменить какой-то кусок общего массива и связаться со всеми рядами.Я пытался использовать MPI_Allgather, но результат не является правильным.Я думаю, это потому, что каждый ранг использует свои локальные упорядоченные [i] , упорядоченные [i + n] , а не глобальные.Как я могу распараллелить это?Какие-либо предложения?Спасибо за вашу помощь.

  start = my_rank * (samples/numprocs);
  end = (my_rank + 1) * (samples/numprocs);
  MPI_Bcast(W, (samples/2)-1, MPI_DOUBLE_COMPLEX, 0, MPI_COMM_WORLD);
  MPI_Bcast(ordered, samples, MPI_DOUBLE_COMPLEX, 0, MPI_COMM_WORLD);


  MPI_Barrier(MPI_COMM_WORLD);

  long int n = 1;
  long int a = samples / 2;  

  for(int j = 0; j < log2(samples); j++){

    for(long int i = start; i < end; i++) {
      if(!(i & n)) {

        complex<double> temp = ordered[i];
        long int index =  (i * a) % (n * a);
        complex<double> Temp = W[index] * ordered[i + n]; 


        //ordered[i] = temp + Temp;
        //ordered[i + n] = temp - Temp; 

        complex<double>first = temp+Temp;
        complex<double>second = temp-Temp;

        MPI_Allgather(&first,1, MPI_DOUBLE_COMPLEX, &ordered[i],1,MPI_DOUBLE_COMPLEX,MPI_COMM_WORLD);
        MPI_Allgather(&second,1, MPI_DOUBLE_COMPLEX, &ordered[i+n],1,MPI_DOUBLE_COMPLEX,MPI_COMM_WORLD);
      }

    }
    n *= 2;
    a = a / 2;
  }
...