Является ли MPI_Reduce блокирующим (или естественным барьером)? - PullRequest
7 голосов
/ 15 февраля 2012

У меня есть фрагмент кода ниже в C ++, который в основном вычисляет пи с использованием классической техники Монте-Карло.

    srand48((unsigned)time(0) + my_rank);

    for(int i = 0 ; i < part_points; i++)
    {
            double x = drand48();

            double y = drand48();

            if( (pow(x,2)+pow(y,2)) < 1){ ++count; }
    }

    MPI_Reduce(&count, &total_hits, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);

    if(my_rank == root)
    {
            pi = 4*(total_hits/(double)total_points);

            cout << "Calculated pi: "  <<  pi << " in " << end_time-start_time <<  endl;
    }

Мне просто интересно, нужен ли вызов MPI_Barrier. Проверяет ли MPI_Reduce, что тело оператора if не будет выполнено до полного завершения операции приведения? Надеюсь, мне было ясно. Спасибо

Ответы [ 3 ]

10 голосов
/ 15 февраля 2012

Да, все коллективные вызовы (уменьшение, разброс, сбор и т. Д.) Блокируются. Там нет необходимости для барьера.

3 голосов
/ 11 марта 2013

Блокировка да, барьер, нет. Очень важно вызвать MPI_Barrier() для MPI_Reduce() при выполнении в узком цикле. Если не вызывать MPI_Barrier(), приемные буферы процесса сокращения в конечном итоге запустятся и приложение будет прервано. В то время как другие участвующие процессы должны только отправлять и продолжать, процесс сокращения должен получать и уменьшать. Приведенный выше код не нуждается в барьере, если my_rank == root == 0 (что, вероятно, верно). В любом случае ... MPI_Reduce() не выполняет барьер или какую-либо форму синхронизации. AFAIK даже MPI_Allreduce() не гарантирует синхронизацию (по крайней мере, не по стандарту MPI).

1 голос
/ 02 января 2018

Спросите себя, нужен ли этот барьер. Предположим, вы не корень; Вы звоните уменьшить, который отсылает ваши данные. Есть ли причина сидеть и ждать пока рут даст результат? Ответ: нет, значит, вам не нужен барьер.

Предположим, вы корень. Вы делаете сокращение вызова. Семантически вы теперь вынуждены сидеть и ждать, пока результат не будет полностью собран. Так почему барьер? Опять же, барьерный вызов не требуется.

В общем, вам почти никогда не нужен барьер, потому что вас не волнует временная синхронизация. Семантика гарантирует, что ваше локальное состояние будет правильным после запроса на уменьшение.

...