【发布时间】:2014-01-29 01:08:03
【问题描述】:
我正在尝试使用MPI_Win_lock 和MPI_Win_unlock 对MPI 的RMA 操作进行简单测试。程序只是让进程0更新进程1中的整数值并显示出来。
下面的程序运行正确(至少结果对我来说是正确的):
#include "mpi.h"
#include "stdio.h"
#define root 0
int main(int argc, char *argv[])
{
int myrank, nprocs;
int send, recv, err;
MPI_Win nwin;
int *st;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Alloc_mem(1*sizeof(int), MPI_INFO_NULL, &st);
st[0] = 0;
if (myrank != root) {
MPI_Win_create(st, 1*sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &nwin);
}
else {
MPI_Win_create(NULL, 0, sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &nwin);
}
if (myrank == root) {
st[0] = 1;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 1, 0, nwin);
MPI_Put(st, 1, MPI_INT, 1, 0, 1, MPI_INT, nwin);
MPI_Win_unlock(1, nwin);
MPI_Win_free(&nwin);
}
else { // rank 1
MPI_Win_free(&nwin);
printf("Rank %d, st = %d\n", myrank, st[0]);
}
MPI_Free_mem(st);
MPI_Finalize();
return 0;
}
我得到的输出是Rank 1, st = 1。但奇怪的是,如果我将 else 块中 1 级的行切换到
else { // rank 1
printf("Rank %d, st = %d\n", myrank, st[0]);
MPI_Win_free(&nwin);
}
输出为Rank 1, st = 0。
我找不到它背后的原因,以及为什么我需要在加载数据后放入MPI_Win_free,原来我需要将所有东西放在一个while循环中,让rank 0来确定何时停止循环。当条件满足时,我尝试让 rank 0 更新 rank 1 中的标志 (st)。我尝试将 MPI_Win_free 放在 while 循环之外,这样窗口只会在循环后被释放。现在看来我无法做到这一点,需要每次在循环中创建和释放窗口?
【问题讨论】:
-
欢迎您!通常我们会尽量避免在问题中使用感谢标语以使它们更整洁,您可以在此处阅读原因:“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?”。