我有多个并行运行的MPI
进程,所有这些进程都访问共享内存并执行以下操作:
sem_wait(sem);
shmid = shmget(key, sizeof(int), 0777)) < 0)
shm = shmat(shmid, NULL, 0);
printf("process id = %d, shm = ",rank, *shm);//rank from MPI_Comm_rank()
new_val = *shm+1;
*shm = new_val;
sem_post(sem);
这段代码是我无法放在此处的更大代码的一部分,因此我只给出了一小部分,我认为需要更改。
我得到以下结果(首次运行):
process id = 1 shm = 1
process id = 2 shm = 2
process id = 3 shm = 3
process id = 4 shm = 4
process id = 5 shm = 5
我得到以下结果(第二次运行):
process id = 2 shm = 1
process id = 3 shm = 2
process id = 1 shm = 3
process id = 5 shm = 4
process id = 4 shm = 5
同样,不同的运行结果也不同。
是否可以通过每次生成相同值的方式更改代码?
我正在Linux环境中使用C。
我非常需要代码中的可重复性。任何形式的帮助将不胜感激。谢谢 !
最佳答案
在不考虑这是否是一个好主意的情况下,似乎您希望确定各个过程之间的系统调用顺序。使用MPI完全可以实现-例如:
for (int ii = 0; ii < MPI_Comm_size(); ii++) {
if ii == MPI_Comm_rank() {
// attach shmem
}
MPI_Barrier(MPI_COMM_WORLD);
}
这将使进程“轮流”附加到共享内存。