如何确保多进程计算中结果的可重复性

时间:2013-07-04 06:39:31

标签: c multiprocessing mpi shared-memory semaphore

我有多个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语言。

我在代码中非常需要可重复性。任何形式的帮助将不胜感激。谢谢 !

1 个答案:

答案 0 :(得分:0)

在不考虑这是否是一个非常好的想法的情况下,您似乎希望在各种流程之间进行系统调用的确定性排序。用MPI可以实现这一点 - 例如:

for (int ii = 0; ii < MPI_Comm_size(); ii++) {
    if ii == MPI_Comm_rank() {
        // attach shmem
    }
    MPI_Barrier(MPI_COMM_WORLD);  
}

这将使流程&#34;轮流&#34;附加到共享内存。