2013-11-17 5 views
0

У меня есть этот код, где мастер отправляет исходные данные своим подчиненным. Он использует функцию MPI_Bcast (широковещательная передача), но когда вызывается Broadcast, мастер продолжает работу, но подчиненные устройства застревают в тупике.MPI_Bcast deadlock

фрагменты кода следующие:

Master { 
    run() { 
     ... 
     MPI_Pack(&offset, 1, MPI_INT, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD); 
     MPI_Pack(&dataSize, 1, MPI_INT, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD); 
     MPI_Pack(dataLoader.getData(), dataSize*dataSize, MPI_CHAR, buffer, BUFFERSIZE, &position, MPI_COMM_WORLD); 
     MPI_Bcast(buffer, position, MPI_PACKED, 0, MPI_COMM_WORLD); 
     printf("master ok"); 
    } 
} 

Slave { 
    run() { 
     MPI_Bcast(buffer, BUFFERSIZE, MPI_PACKED, 0, MPI_COMM_WORLD); 
     printf("Slave OK"); 
     //unpack 
     MPI_Unpack(buffer, BUFFERSIZE, &position, &offset, 1, MPI_INT, MPI_COMM_WORLD); 
     MPI_Unpack(buffer, BUFFERSIZE, &position, &dataSize, 1, MPI_INT, MPI_COMM_WORLD); 
     data = new char[dataSize * dataSize]; 
     MPI_Unpack(buffer, BUFFERSIZE, &position, data, dataSize*dataSize, MPI_CHAR, MPI_COMM_WORLD); 

    } 
} 

Выход будет: Master нормально

и ведомые перестанет отвечать на запросы. Спасибо за помощь

ответ

1

mpi_bcast должно быть вызвано всеми процессами в коммуникаторе, и все они должны столкнуться с вызовом в той же точке кода. Когда вы написали свой (псевдо) код, корневой процесс делает вызов для трансляции, который не выполняются рабочими процессами, а рабочие процессы вызывают вызов, который нет в корне.

mpi_bcast является одним из процедур MPI , библиотека позаботится о том, чтобы определить правильный шаблон отправки сообщений на основе аргументов, которые вы передаете ему. В случае mpi_bcast 4-й аргумент является идентификатором источника широковещательной передачи (он не обязательно должен быть корневым процессом коммуникатора, хотя он часто бывает); все остальные процессы в коммуникаторе будут приемниками.

+0

хорошо все процессы вызывают mpi_bcast() только один раз в программе. Перед этими вызовами нет данных, зависящих от данных, поэтому там не может быть зависаний. Дело в том, что он работает на моем ноутбуке с помощью процессов на месте, но зависает на кластере. – Eramol