遇到问题并行化

时间:2012-02-19 23:56:03

标签: for-loop

我计算了一些总和,我需要找到最小值。我能够连续进行,但是我很难用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_Rinuce和MPI_Min参数,只是使用我自己的方法来获得最小值,但是我从来没有得到与串行版本相同的答案。任何有关我的错误行为的见解都将受到赞赏

1 个答案:

答案 0 :(得分:1)

只拆分外环并保持内环不变。如果有4个流程,那么您希望每个流程完成四分之一的工作,而不是“工作的四分之一”。

您应该分别跟踪每个流程的本地金额和本地最小值,并且只在完成所有工作后合并每个流程的总和和最小值。这意味着将第一个“MPI_Reduce()”移出循环/ s并将其放在第二个“MPI_Reduce()”所在的位置。这也意味着您仍需要执行“if(sum&lt; min){min = sum;}”来确定流程的“本地最小值”。