Я сталкиваюсь с проблемами точности с MPI_REDUCE() в fortran. Я проверил два метода суммирования чисел двойной точности, хранящихся на каждом узле. Линии MPI_REDUCE() я используюТочные проблемы с MPI_REDUCE
call MPI_REDUCE(num,total,1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,ierr)
, который хранит сумму значений «пит» на каждое ядро и отправляет его на «всего» на корневом ядре.
Другой метод я использую включает передачу и прием
if (rank .eq. 0) total = num
do i = 1,nproc-1
if (rank .eq. i) call MPI_SEND(num,1,MPI_DOUBLE_PRECISION,0,&
100,MPI_COMM_WORLD,ierr)
if (rank .eq. 0) then
call MPI_RECV(num,1,MPI_DOUBLE_PRECISION,i,&
100,MPI_COMM_WORLD,stat,ierr)
total = total + num
end if
end do
Последние всегда дает мне тот же номер для общей сложности, в то время как бывшие производит различное значение в зависимости от количества процессоров, которые я использую (Это обычно изменяется на 1x10^-5 или около того). ierr = 0 во всех случаях. Я делаю что-то неправильно?
Благодаря
Спасибо за ответ. Вот пример. Для 4 ядер каждый хранит один из следующих номеров. -.016578650712928463 -.005729268089031345 -.012569993133665655 -.055321271877137639 Мой метод отправки/RECV дает результат -9.0199183812763095E-002 Метод MPI_REDUCE дает результат -9.0199110912786068E-002 Mathematica соглашается с моим методом send/recv. Еще раз спасибо – DJames
Не только это, но и 'MPI_SUM' и все другие предопределенные операторы сокращения MPI также ** коммутативны **, и поэтому аргументы суммирования могут быть спарены в любом порядке. –