Программа разделения множеств Дейкстра

 

Рассматриваетмя класический вариант программы (см. приложение)

Задача: Найти причину, по которой происходит "зависание" программы

Шаг 1. (создание проекта)

создаем директорию, копируем в нее файл div.c Никаких действий по разметке кода не выполняем.

Шаг 2. (обработка кода)

Исполняем команду

./gepard_pars.pl _путь_до_проекта_
Шаг 3. (компиляция)

Переходим в директорию _путь_до_проекта_ и выполняем команду

mpicc -o div div.c _путь_до_библиотеки_/mon.a
Шаг 4. (запуск программы)

Запуск программы производится командой

mpirun -np 2 div

После запершения программы в директории, откуда производился запуск появятся 2 файла: div.grd.0 div.grd.1 "Зависание" программы произойдет, но не более чем на 5 секунд (параметр по умолчанию)

Шаг 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:79
	
Cтроки соответствующие сообщениям:
	div.c:37	MPI_Recv(&get, 1, MPI_INT, 1, 12, MPI_COMM_WORLD, NULL);
	div.c:79	MPI_Finalize();
	

Вывод: процесс с ранком 1 уже завершился, в то время как процесс с ранком 0 ждет от него сообщения. При этом процессы в момент блокировки находятся в состоянии, указаном выше.