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);
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.