Я пытаюсь запустить гибридную программу OpenMP & MPI.Это мой код, который должен распараллеливать матричное / векторное умножение:
#include <mpi.h>
#include <omp.h>
#include <stdio.h>
#define N 5000
double A[N][N], x[N], y[N], alpha, beta, result[N];
int main (int argc, char *argv[])
{
int i, j, error, rank, size;
double startt, endt;
error = MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Barrier(MPI_COMM_WORLD);
startt=MPI_Wtime();
int count = N / size;
int remainder = N % size;
int start, stop;
int displs[size];
int recv_counts[size];
if(rank<size-1){
//first n-1 processes do N/size amount of work
start=rank*(count);
stop=start+(count-1);
}
else if (rank==(size-1)){
//last process does N/size+N%size amount of work
start=rank*(count);
stop=N-1;
}
for (i=0; i<size; i++) {
if(i<size-1){
recv_counts[i] =count;
}
else
{
recv_counts[i]=count+remainder;
}
displs[i] = i*count;
}
#pragma omp parallel for shared(A, x, y, alpha, beta, result) private(i, j)
for (int i = start; i <= stop; ++i) {
result[i] = 0;
for(j=0; j<N; j++){
result[i] += A[i][j] * x[j];
}
result[i] = alpha * result[i] + beta * y[i];
}
MPI_Allgatherv(&result[start], stop-start+1, MPI_DOUBLE,
&result[0], recv_counts, displs,
MPI_DOUBLE, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
endt = MPI_Wtime();
if(rank==0){
printf("Done in %f seconds.\n", endt - startt);
}
error = MPI_Finalize();
return 0;
}
Я компилирую программу, используя mpicc -openmp test.c -o test
, однако получаю следующее предупреждение: предупреждение: ignoring #pragma omp parallel [-Wunknown pragmas-]
Код работает нормально без OpenMP.Может кто-нибудь подсказать мне, что я делаю не так?