у меня два вопроса; Первый из них:
Я собираюсь использовать msmpi, и я имел в виду "только mpi", что мы не должны использовать сокеты, мое приложение о масштабируемой распределенной структуре данных; изначально у нас есть сервер, содержащий файл, который имеет переменный размер (размер может быть увеличен за счет вставок и может быть уменьшен за счет удаления), а когда размер файла превысит определенный предел, файл будет разделен, половина останется на первом сервере и вторая половина будет перенесена на новый сервер и так далее ... и клиент должен быть всегда проинформирован адресом данных, которые он хочет получить, чтобы у него было изображение операции разделения файла. наконец, я надеюсь, что проясню.
и второй:
Я пытался скомпилировать простое клиент-серверное приложение (источник кода ниже) с помощью msmpi или mpich2, и оно не работает и выдает мне сообщение об ошибке «Неустранимая ошибка в mpi_open_port () и другие ошибки стека» , поэтому я установил open mpi на ubunto 11.10 и попытался запустить тот же пример, он работал на стороне сервера и дал мне имя порта, но на стороне клиента он выдал мне сообщение об ошибке:
[user-Compaq-610:03833] [[39604,1],0] ORTE_ERROR_LOG: Not found in file ../../../../../../ompi/mca/dpm/orte/dpm_orte.c at line 155
[user-Compaq-610:3833] *** An error occurred in MPI_Comm_connect
[user-Compaq-610:3833] *** on communicator MPI_COMM_WORLD
[user-Compaq-610:3833] *** MPI_ERR_INTERN: internal error
[user-Compaq-610:3833] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 3833 on
node toufik-Compaq-610 exiting without calling "finalize". This may
have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).
так что я запутался, в чем проблема, и я потратил некоторое время, пытаясь ее исправить,
Я был бы рад, если бы кто-нибудь мог помочь мне с этим, и заранее поблагодарить вас.
исходный код здесь:
/* the server side */
#include <stdio.h>
#include <mpi.h>
main(int argc, char **argv)
{
int my_id;
char port_name[MPI_MAX_PORT_NAME];
MPI_Comm newcomm;
int passed_num;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
passed_num = 111;
if (my_id == 0)
{
MPI_Open_port(MPI_INFO_NULL, port_name);
printf("%s\n\n", port_name); fflush(stdout);
} /* endif */
MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm);
if (my_id == 0)
{
MPI_Send(&passed_num, 1, MPI_INT, 0, 0, newcomm);
printf("after sending passed_num %d\n", passed_num); fflush(stdout);
MPI_Close_port(port_name);
} /* endif */
MPI_Finalize();
exit(0);
} /* end main() */
и на стороне клиента:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int passed_num;
int my_id;
MPI_Comm newcomm;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
MPI_Comm_connect(argv[1], MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm);
if (my_id == 0)
{
MPI_Status status;
MPI_Recv(&passed_num, 1, MPI_INT, 0, 0, newcomm, &status);
printf("after receiving passed_num %d\n", passed_num); fflush(stdout);
} /* endif */
MPI_Finalize();
return 0;
//exit(0);
} /* end main() */