首先,我需要计算一些和,然后找到这些和的最小值,这是这样做的,使用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();
然而,现在我需要找到矩阵中每个分区的最小和,而不是整个2D矩阵的最小和。一个分区将是由四个点定义的正方形,无论矩阵大小,总是有16个正方形(矩阵不小于800*800)。我正试图使用MPI笛卡尔拓扑来实现这一点,但我在理解实现时遇到了困难。如有任何帮助或提示,我们将不胜感激。
这更像是一个扩展注释,而不是一个答案。。。
像francesco一样,我不确定我是否认为这里需要笛卡尔(或任何其他)拓扑。如果您的问题正如您所描述的那样,那么每个MPI进程都可以计算分区最小和,而无需发送或接收来自其他进程的数据(可能除了初始分散和最终聚集)。
拓扑通常用于问题分解为多个部分的情况,并且这些部分具有一些相对邻域的概念:例如,在笛卡尔拓扑中,一个过程(或问题的一部分)可能有东、西、北和南邻居。我在这里看不到这样的概念,也没有任何实用性来迫使它解决这个问题。