Рассматриваетмя класический вариант программы (см. приложение)
Задача: Найти причину, по которой происходит "зависание" программы
Шаг 1. (создание проекта)
Шаг 2. (обработка кода)создаем директорию, копируем в нее файл div.c Никаких действий по разметке кода не выполняем.
Шаг 3. (компиляция)Исполняем команду
./gepard_pars.pl _путь_до_проекта_
Шаг 4. (запуск программы)Переходим в директорию _путь_до_проекта_ и выполняем команду
mpicc -o div div.c _путь_до_библиотеки_/mon.a
Шаг 5. (анализ)Запуск программы производится командой
mpirun -np 2 div После запершения программы в директории, откуда производился запуск появятся 2 файла: div.grd.0 div.grd.1 "Зависание" программы произойдет, но не более чем на 5 секунд (параметр по умолчанию)
Производим "сливание" 2 файлов в один командой
cat div.grd.* > div.grd Переименуем файл базы данных проекта (*.fdb) в div.fdb и поместим его рядом с файлом div.grdДля начала просто попробуем прочитать полученный файл отчета div.grd. Для этого исполним команду
gprd_ta div.grd В результате получим два сообшенияFunction MPI_Recv was termitated for idle Process rank 0 Location div.c:37 Function MPI_Finalize was termitated for idle Process rank 1 Location div.c:79Cтроки соответствующие сообщениям:div.c:37 MPI_Recv(&get, 1, MPI_INT, 1, 12, MPI_COMM_WORLD, NULL); div.c:79 MPI_Finalize();Вывод: процесс с ранком 1 уже завершился, в то время как процесс с ранком 0 ждет от него сообщения. При этом процессы в момент блокировки находятся в состоянии, указаном выше.