Проблемы с распараллеливанием - PullRequest
0 голосов
/ 20 февраля 2012

Я рассчитываю количество сумм, и мне нужно найти минимум сумм. Я могу делать это поочередно, но мне трудно распараллелить его, используя mpi. Поочередно я вычисляю конкретные суммы и нахожу минимумы следующим образом:

for(i = 0; i < size; i++){
    for(j = 0; j < size; j++){
        for(k = 0; k < size; k+=gap){
            for(m = 0; m < size; m+=gap){
                c1 = calculation1(i,j,k,m);
                if(c1 > cutoff){
                    sum += calculation2(modifier1[k][m], modifier2[k][m]);
                }
            }
        }
        if(sum < min){
            min = sum;
        }
        sum = 0;
    }
}

Это то, что я сейчас использую для параллельной версии, использующей mpi:

        MPI_Init(&argc, &argv);
        MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
        MPI_Comm_rank(MPI_COMM_WORLD, &myid);
                     .
                     .
                     .   
        x = (size)/numprocs;
        low = myid * x;
        high = low + x;

        for(i =low; i < high; i++){
            for(j = low; j < high; j++){
                for(k = low; k < high; k+=gap){
                    for(m = low; m < high; m+=gap){
                                        c1 = calculation1(i,j,k,m);
                        if(c1 > cutoff){
                            sum += calculation2(modifier1[k][m], modifier2[k][m]);
                        }      
                    }
                }

                MPI_Reduce(&sum, &result, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD);
                sum = 0;
            }
        }   
    MPI_Reduce(&result, &minimum, 1, MPI_FLOAT, MPI_MIN, 0, MPI_COMM_WORLD);
    if( 0 == myid)
    printf("The  min is: %f", minimum);
    MPI_Finalize();

Я пробовал другие варианты, в том числе не использовать MPI_Reduce с аргументом MPI_Min и просто использовать мой собственный метод для получения минимума, однако я никогда не получаю тот же ответ, что и в серийной версии. Любое понимание того, что моя ошибка здесь, будет оценено

1 Ответ

1 голос
/ 20 февраля 2012

Разбейте только внешнюю петлю и оставьте внутренние петли такими же. Если есть 4 процесса, то вы хотите, чтобы каждый процесс выполнял четверть работы, а не «четверть четверти четверти» работы.

Вы должны отслеживать локальную сумму и локальный минимум для каждого процесса в отдельности, и суммировать сумму и минимум для каждого процесса только после того, как вся работа была выполнена. Это означает удаление первого MPI_Reduce () из цикла / ов и размещение его там, где находится второй MPI_Reduce (). Это также означает, что вам все еще нужно выполнить «if (sum

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...