2013-07-04 2 views
0

У меня есть несколько 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); 

Этот код является частью гораздо больше код, который я не могу поставить здесь, поэтому я дал лишь небольшую часть, которую, я думаю, нужно изменить.

Я получаю follwing результата (для первого запуска):

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 

Я получаю follwing результата (для второй серии):

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 

Точно так же различные результаты для различных опытов.

Можно ли изменить код так, чтобы он генерировал одинаковое значение каждый раз?

Я работаю над C в среде linux.

Мне очень нужна повторяемость в моем коде. Любая помощь была бы весьма признательна. Благодаря !

+0

Возможно, но для этого требуется больше кода. Вам действительно нужно это делать? –

+0

@OliCharlesworth да Мне очень нужна повторяемость в моем коде. Любая помощь была бы весьма признательна. Благодаря ! –

+0

Если вам нужен точный порядок выполнения, каждый раз, возможно, параллельная модель не является оптимальной для проблемы, которую вы пытаетесь решить. Правильно написанная параллельная программа даст тот же результат независимо от порядка, в котором операционная система планирует потоки и процессы. Общее решение для получения точного упорядочения операций - использовать один поток/процесс. Вы можете заставить потоки вести себя упорядоченным образом, но для каждой блокировки и операции требуется мысль и забота и, скорее всего, удалите параллелизм. – Art

ответ

0

Не понимая, действительно ли это очень хорошая идея, вам кажется, что вы хотите детерминированный порядок системных вызовов между различными процессами. Это вполне достижимо с MPI - например:

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

Это сделает процессы «по очереди» подключенными к общей памяти.

Смежные вопросы