C 如何确保多进程计算结果的可重复性
我有多个并行运行的C 如何确保多进程计算结果的可重复性,c,multiprocessing,mpi,shared-memory,semaphore,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; se
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);
我得到以下结果(第二次运行):
同样,对于不同的运行,结果也不同
是否有可能以每次生成相同值的方式更改代码
我正在linux环境下使用C
我非常需要代码的可重复性。任何形式的帮助都将不胜感激。谢谢 不必讨论这是否是一个非常好的主意,您似乎希望在不同进程之间确定系统调用的顺序。这在MPI中是可以实现的——例如:
for (int ii = 0; ii < MPI_Comm_size(); ii++) {
if ii == MPI_Comm_rank() {
// attach shmem
}
MPI_Barrier(MPI_COMM_WORLD);
}
for(int ii=0;ii
这将使进程“轮流”连接到共享内存。这是可能的,但需要更多的代码。你真的需要这样做吗?@OliCharlesworth是的,我非常需要代码的可重复性。任何形式的帮助都将不胜感激。谢谢如果您希望每次都有一个精确的执行顺序,那么对于您试图解决的问题,并行模型可能不是最优的。无论操作系统调度线程和进程的顺序如何,正确编写的并行程序都将产生相同的结果。获得操作精确顺序的一般解决方案是使用单个线程/进程。您可以使线程以有序的方式运行,但这需要仔细考虑每个锁和操作,并且很可能会删除并行性。此外,在未检查返回值的情况下,永远不要使用
shm*
或sem.*
库调用。它们可能会被信号中断,例如,你永远不会得到这样一个稳定的应用程序。@JensGustedt是的,我正在检查实际代码中的返回值。为了简单起见,我在这里避开了它们。谢谢
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
for (int ii = 0; ii < MPI_Comm_size(); ii++) {
if ii == MPI_Comm_rank() {
// attach shmem
}
MPI_Barrier(MPI_COMM_WORLD);
}