Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何确保多进程计算结果的可重复性_C_Multiprocessing_Mpi_Shared Memory_Semaphore - Fatal编程技术网

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);  
}