Я сделал кластерное приложение, используя MPI. Он вычисляет некоторую проблему, используя конструкцию ведущий-ведомый. Все работает просто отлично, но когда подчиненный процесс должен отправить свой результат обратно главному процессу, он завершается ошибкой прямо в MPI_Send с 'Address not mapped'.
Это код, который обрабатывает связь между ведомым и ведущим.
void main_slave( int width, int height ) {
int transferSize = 6 + width * height;
int responseSize = 1 + width * height;
int* buffer = new int[transferSize];
int* response = new int[responseSize];
MPI_Status status;
while ( true ) {
MPI_Recv( buffer, transferSize, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status );
if ( status.MPI_TAG == TAG_DONE ) break;
State state = deserialize_task( width, height, buffer );
task_solve( state );
response[0] = maximum;
serialize_board( best, &response[1] );
MPI_Send( response, responseSize, MPI_INT, 0, TAG_DONE, MPI_COMM_WORLD);
}
delete[] buffer;
delete[] response;
}
Это вывод ошибки при сбое. Там вы можете видеть, что он почему-то не работает прямо в MPI_Send.
[star:27344] *** Process received signal ***
[star:27344] Signal: Segmentation fault (11)
[star:27344] Signal code: Address not mapped (1)
[star:27344] Failing at address: 0x584f4f4fa0
[star:27344] [ 0] /usr/lib64/libpthread.so.0(+0xf5d0)[0x7f85705155d0]
[star:27344] [ 1] /usr/lib64/openmpi/mca_pml_ob1.so(mca_pml_ob1_send+0x68)[0x7f8565987d08]
[star:27344] [ 2] /usr/lib64/libmpi.so.40(PMPI_Send+0xf2)[0x7f85711e0792]
[star:27344] [ 3] run.exe[0x402977]
[star:27344] [ 4] run.exe[0x4035f0]
[star:27344] [ 5] /usr/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f857015b3d5]
[star:27344] [ 6] run.exe[0x4016c9]
[star:27344] *** End of error message ***