c - 多进程计算中如何保证结果的重复性

标签 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语言。

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

最佳答案

在不考虑这是否是一个好主意的情况下,您似乎希望在各个进程之间对系统调用进行确定性排序。使用 MPI 完全可以实现这一点 - 例如:

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

这将使进程“轮流”附加到共享内存。

关于c - 多进程计算中如何保证结果的重复性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17463417/

相关文章:

具有变量名的Python奇怪的多处理

parallel-processing - 何时使用 MPI、OpenMP 和 PBS Pro 进行超线程?

c++ - 从 C++ 中的函数返回二维数组

c - 输入小数点后一位

python 非阻塞 recv 与进程之间的管道?

multithreading - 在 SLURM 环境中运行 FFMPEG 多线程

c - 使用 ","和 "{}"打印格式化数组

java - 如何将字符串分成字符数组

mpi - 使用 MPI 合并所有等级的数组

mpi - 单节点、多个MPI任务