Введём определение команды синхронной команды "параллельного шага". Примем, что для выполнения команды "шаг параллельной программы" группой процессов каждому процессу из группы, завершившему предыдущие команды перемещения, необходимо выполнить действия, определяемые командой "шаг" последовательного отладчика ("последовательной" команды "шаг"). Шаг параллельной программы будем считать завершённым, если каждый процесс отлаживаемой программы:
Назовем "тривиальной параллельной" причиной незавершения параллельной команды шаг процессом ожидание синхронизации с другими процессами, про которую известно, что она не произойдет на данном шаге параллельной программы.
Пример 1. Рассмотрим пошаговое выполнение следующей MPI-программы:
/* 0*/ #include "mpi.h" /* 1*/ int main(int argc, char **argv) { /* 2*/ int rank, i; /* 3*/ MPI_Init(&argc, &argv); /* 4*/ MPI_Comm_rank(MPI_COMM_WORLD, &rank); /* 5*/ if (rank == 1) { /* 6*/ MPI_Status stat; /* 7*/ MPI_Recv(&i,1,MPI_INT,0,0,MPI_COMM_WORLD,&stat); /* 8*/ } /* 9*/ if (rank == 0) { /*10*/ i = 0; /*11*/ MPI_Send(&i,1,MPI_INT,1,0,MPI_COMM_WORLD); /*12*/ } /*13*/ MPI_Finalize(); /*14*/ return 0; /*15*/ }Пусть отладчик является "умным", то есть обрабатывающим "тривиальные параллельные" причины незавершения шага и интерпретирует вычисление управляющего выражения условного оператора как самостоятельный шаг. Пусть, кроме того, команды выдаются для всех процессоров отлаживаемой программы, и текущей строкой для всех процессов является строка 3. Тогда для последовательности шагов параллельной программы для различных процессов текущими будут следующие строки: