Распараллеливание алгоритма сортировки массива, страница 2

fscanf(fp,"%f ",&x[k]);

fclose(fp);                            // Закрываем файл

}

else                                     // Если мы не последний проц

{                                      //   то все принимаем от последнего

MPI_Recv(&N,1,MPI_INT,size-1,15,MPI_COMM_WORLD,&st);

MPI_Recv(&rows,1,MPI_INT,size-1,15,MPI_COMM_WORLD,&st);

x = (float*)malloc(rows*sizeof(float));

MPI_Recv(x,rows,MPI_FLOAT,size-1,15,MPI_COMM_WORLD,&st);

}

// Выводим информацию к размышлению

printf("My rank is %d. Rows = %d\n",rank,rows);

// ============================ Начало счета ==================================

if (rank == 0) t_st = clock();           // Нулевой проц засекает время

while (RightWiseSort(rows,x));           // Сортируем свои эл-ты

status = ST_WORKING;          

while (status == ST_WORKING)             // Пока есть результативные обмены

{

status = ST_NOEXCHANGE;

if ((rank%2) == 0)                     // Четные компы сначала обмениваются

{                                    //   с соседом справа

if (rank != size-1)                  //   при условии, что он не последний

{

el = x[rows-1];                  

MPI_Send(&el,1,MPI_FLOAT,rank+1,15,MPI_COMM_WORLD);

MPI_Recv(&el,1,MPI_FLOAT,rank+1,15,MPI_COMM_WORLD,&st);

if (el < x[rows-1])               // Если надо, производим обмен и сортинг

{

x[rows-1] = el;                

LeftWiseSort(rows,x);

status = ST_WORKING;           

}

else                              // Если обменов не было, выставляем флаг

status = ST_NOEXCHANGE;        

}

if (rank != 0)                      // Затем выполняем обмен с соседом слева

{                                 //   по аналогичному сценарию

el = x[0];                       

MPI_Send(&el,1,MPI_FLOAT,rank-1,15,MPI_COMM_WORLD);

MPI_Recv(&el,1,MPI_FLOAT,rank-1,15,MPI_COMM_WORLD,&st);

if (el > x[0])                   

{

x[0] = el;                     

RightWiseSort(rows,x);

status = ST_WORKING;            

}                              

}

}

else                                  // У нечетных все то же самое, только

{                                   //   сначала обмен с соседом слева

if (rank != 0)                      // Обмен налево

{

el = x[0];

MPI_Send(&el,1,MPI_FLOAT,rank-1,15,MPI_COMM_WORLD);

MPI_Recv(&el,1,MPI_FLOAT,rank-1,15,MPI_COMM_WORLD,&st);

if (el > x[0])

{

x[0] = el;

RightWiseSort(rows,x);

status = ST_WORKING;

}

else

status = ST_NOEXCHANGE;

}

if (rank != size-1)                 // Обмен направо

{

el = x[rows-1];

MPI_Send(&el,1,MPI_FLOAT,rank+1,15,MPI_COMM_WORLD);

MPI_Recv(&el,1,MPI_FLOAT,rank+1,15,MPI_COMM_WORLD,&st);

if (el < x[rows-1])

{

x[rows-1] = el;

LeftWiseSort(rows,x);

status = ST_WORKING;

}

}

}

flag = status;                        // Сравнение флагов по всем компам

MPI_Allreduce(&flag,&status,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);

}