【问题标题】:How to use MPI Cartesian Topology Correctly如何正确使用 MPI 笛卡尔拓扑
【发布时间】:2012-03-17 14:24:37
【问题描述】:

首先,我需要计算一些总和,然后找到这些总和的最小值,这是使用 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 = 0; j < matrixDim; j++){
            for(k = 0; k < matrixDim; k+=gap){
                for(m = 0; m < matrixDim; m+=gap){
                    c1 = calculation1(i,j,k,m);
                    if(c1 > cutoff){
                        sum += calculation2(modifier1[k][m], modifier2[k][m]);
                    }      
                }
            }

            if(sum < min){
                min = sum;
                minI = i;
                minJ = j;
            }
            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();

但是,现在我不需要找到整个二维矩阵的最小和,而是需要找到矩阵中每个分区的最小和,一个分区将是一个由四个点定义的正方形,无论矩阵大小如何,总会有 16 个方格(矩阵不小于 800 * 800)。我正在尝试使用 MPI 笛卡尔拓扑来实现这一点,但是我在围绕实现时遇到了麻烦。任何帮助或提示将不胜感激。

【问题讨论】:

  • 您能否详细说明您希望如何对算法进行最高并行化?您打算并行化哪些循环以及笛卡尔拓扑在哪里发挥作用?

标签: parallel-processing mpi topology cartesian


【解决方案1】:

这更像是一个扩展评论而不是一个答案......

就像francesco 一样,我不确定我是否需要在这里使用笛卡尔(或任何其他)拓扑。如果您的问题与您描述的一样,则每个 MPI 进程都可以计算分区最小总和,而无需从其他进程发送或接收数据(可能来自初始分散和终端聚集)。

拓扑通常用于问题分解成碎片并且这些碎片具有某种相对相邻性的情况:例如,在笛卡尔拓扑中,一个进程(或问题的一部分)可能具有东、西、北和南邻域.我在这里没有看到这样的概念,也没有任何实用程序将其强制解决这个问题。

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 2018-03-10
    • 2017-12-17
    • 2017-12-18
    • 2016-02-05
    • 2016-12-01
    • 2017-08-22
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多