Аналог глобальных переменных в MPI?

Как можно организовать что-то на подобе глобальной переменной в MPI? Интересует любой вариант (файловая система, межпроцессорное взоимодействие...). Должно быть расширяемым. Тестирование на 4-х процессорах, будет запускаться на 4096-ти.

Заготовка программы:
#include <cstdio>
#include <vector>
#include <mpi.h>

#include "tools.h"

using namespace std;
unsigned long long d = 0;

unsigned long long get_new_d(int ccpu)
{
	d++;

	return d;
}

int main(int argc, char *argv[])
{
    int ccpu, nprocs;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &ccpu);

    printf("%d: %lld\n",ccpu,get_new_d(ccpu));

    MPI_Finalize();
    return 0;
}



Запуск:
#!/bin/bash

N_PROCESSORS=4

mpiexec -n ${N_PROCESSORS} bent_mpi



Что должно быть? Функция get_new_d должна возвращать каждый раз значение d на 1 больше, чем максимальное d среди всех процессов. Что-то типа:
3: 1
0: 2
1: 3
2: 4



Кто подскажет (а лучше покажет) что-то типа семафора (мьютекса) в MPI тоже буду рад.
  • Вопрос задан
  • 4087 просмотров
Решения вопроса 1
maxpelevin
@maxpelevin
Java-разработчик
Первое, что пришло в голову, — выделить процесс (например 0), который меняет и возвращает значение переменной, остальные процессы будут запрашивать значение и изменение у 0-го процесса. Поскольку процессы независимые, то и семафор не нужен. Сам процесс, понятное дело, сам у себя тоже может запрашивать значение переменной.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
okazymyrov, у тебя довольно странная задача.
Скажи пожалуйста, для чего и на сколько часто ты планируешь использовать этот глобальный счетчик?
По сути ты пытаешься в параллельную систему добавить строго последовательный участок, что может привести к значительной деградации производительности и чем больше ядер — тем больше деградация. 4096 ядер уже достаточно большая величина, чтобы начать следить за потерями производительности из-за синхронизаций.

Напиши задачу, которую ты решаешь, возможно к ней можно придумать более эффективное решение, чем глобальный счетчик.
Ответ написан
icc
@icc
В MPI для таких целей лучше использовать MPI_Bcast. Если же нужны именно глобальные переменные в чистом виде, примените связку OpenMP + MPI.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы