/* * ex2.c -- пример 2 см.также -- http://www.csa.ru/~il/mpi_tutor * * Прием сообщений неизвестной длины: * MPI_Probe * * Прием сообщений от разных отправителей с разными идентификаторами * ( с содержимым разных типов ) в произвольном порядке: * MPI_ANY_SOURCE, MPI_ANY_TAG ( джокеры ) */ #include #include #include #include /* Идентификаторы сообщений */ #define tagFloatData 1 #define tagLongData 2 /* Длина передаваемых сообщений может быть * случайной от 1 до maxMessageElems */ #define maxMessageElems 100 int main( int argc, char **argv ) { int size, rank, count, i, n, ok; float *floatPtr; int *longPtr; char *typeName; MPI_Status status; /* Инициализация и сообщение об ошибке * целиком перенесены из первого примера */ MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); /* пользователь должен запустить ровно ТРИ задачи, иначе ошибка */ if( size != 3 ) { if( rank==0 ) printf("Error: 3 processes required instead of %d\n", size ); MPI_Barrier( MPI_COMM_WORLD ); MPI_Abort( MPI_COMM_WORLD, MPI_ERR_OTHER ); return -1; } /* Каждая задача инициализирует генератор случайных чисел */ srand( ( rank + 1 ) * (unsigned )time(0) ); switch( rank ) { case 0: /* создаем сообщение случайной длины */ count = 1 + rand() % maxMessageElems; floatPtr = malloc( count * sizeof(float) ); for( i=0; i