LINUX.ORG.RU

cpp + mpi


0

1

Здравствуйте, у меня проблема с mpi.

#include <iostream>
#include <mpi.h>
 
int main(int ac, char** av)
{
        int size,rank;
        MPI_Status status;
        MPI_Init (&ac, &av);
        MPI_Comm_rank (MPI_COMM_WORLD, &rank);
        MPI_Comm_size (MPI_COMM_WORLD, &size);
        std::cout << "rank:" << rank << " of " << size << "\n";
        MPI_Finalize();
        return 0;
}
запускаю: mpiexec -np 5 ./sample

выводит:

 
rank:0 of 1
rank:0 of 1
rank:0 of 1
rank:0 of 1
rank:0 of 1
Почему у всех процессов ранг 0, а количество процессов равно 1, если реально запускается их 5?

★★★★★

Скопировал. Скомпилировал без изменения кода. Выполнил. Получил ожидаемый результат.

Хочется подробностей от ТС: ОС, компилятор, реализация mpi, команда сборки.

oami ★★
()
Ответ на: комментарий от oami

Получил ожидаемый результат

То есть — количество процессов 5, ранги от 0 до 4.

oami ★★
()
Ответ на: комментарий от oami

ОС Debian 6 компилятор mpicxx for MPICH2 version 1.2.1p1 запускаю mpiexec (OpenRTE) 1.4.2

собираю командой mpic++ hello.cpp -o exe запускаю командой mpiexec -np 5 ./sample

Ставил из репозиториев.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Reset

Тот же результат: у всех size = 1, rank = 0. :(

Aswed ★★★★★
() автор топика

1. Пробовали ли вы другой mpi (openmpi, например)?

2. Ы, cout. У меня почему-то с ним работать не хотело раньше, а сейчас собралось и хоть бы хны. о_О

pianolender ★★★
()
Ответ на: комментарий от Aswed

mpic++ hello.cpp -o brand_new_name.out mpirun -np 5 ./brand_new_name.out

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

pianolender ★★★
()
Ответ на: комментарий от pianolender

попробовал openmpi, либо я не правильно прагмы использую, либо этот код тоже не параллелится:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <omp.h>
#define M 10000
#define N 10000

using namespace std;

int matrix[N][M];
int vector[M];

void mul()
{
	int vSum[M];
	int* str;
	int i,j;
	for(i=0; i<M; i++)
		vSum[i] = 0;
	for(i=0; i<N; i++)
	{
	str = matrix[i];
#pragma omp parallel shared(str, vector, vSum) private(j)
{
#pragma omp for
		for(j=0; j<M; j++)
		vSum[j] += vector[j] * str[j];
}
	}
	for(i=0; i<M; i++)
		vector[i] = vSum[i];
}

int main()
{
	omp_set_dynamic(0);
	omp_set_num_threads(2);
	cout << "Make matrix...\n";
	srand(time(0));
	for(int i=0; i<N; i++)
	for(int j=0; j<M; j++)
		matrix[i][j] = rand();
	cout << "Make vector...\n";
	srand(time(0));
	for(int i=0; i<M; i++)
		vector[i] = rand();
	cout << "Start\n";
	int t = clock();
	mul();
	cout << clock() - t << endl;
	return 0;
} 

Это усножение матрицы на вектор, если убрать отсюда прагмы, то выполняется за 2340000, а с ними за 3300000. Подскажите, в чем дело?

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Это не openmpi. Это - OpenMP, оно для работы с общей памятью, это совершенно другая вещь.

openmpi есть в репах, как минимум, дебиана, а приходилось мне и собирать из исходников. Где-то на хабре была статья про то, как избежать использованися make install и собирать вместо этого нормльный бинарный пакет.

pianolender ★★★
()
Ответ на: комментарий от Aswed

либо этот код тоже не параллелится

По выводу судить нужно. Если вывод дублируется (у вас же set_num_threads (2)), значит, параллелится. Почему медленнее - не подскажу, я даже не понял, о каких единицах измерения времени идет речь..

pianolender ★★★
()
Ответ на: комментарий от pianolender

я даже не понял, о каких единицах измерения времени идет речь..

если я не ошибаюсь clock() возвращает время в тиках процессора.

Aswed ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.