Я пытаюсь распараллелить клиентский код Fortran с MPI. f
- это массив 4-байтовых вещественных чисел с размерами f(dimx,dimy,dimz,dimf)
. Мне нужны различные процессы для работы с разными частями первого измерения массива. (Я бы предпочел начать с последнего, но это было не до меня.) Итак, я определяю производный тип mpi_x_inteface
следующим образом
call mpi_type_vector(dimy*dimz*dimf, 1, dimx, MPI_REAL, &
mpi_x_interface, mpi_err)
call mpi_type_commit(mpi_x_interface, mpi_err)
Мое намерение состоит в том, чтобы один mpi_x_interface содержал все данные в 'f' с некоторым заданным первым индексом «i». То есть для данного i он должен содержать f(i,:,:,:)
. (Обратите внимание, что на этом этапе игры у всех процедур есть полная копия f
. Я намерен в конечном итоге разделить f
между процессами, за исключением того, что я хочу, чтобы у процесса 0 была полная копия для целей сбора.)
ptsinproc
- это массив, содержащий количество индексов "i", обрабатываемых каждой процедурой. x_slab_displs
- это смещение от начала массива для каждой процедуры. Для двух процессов, которые я тестирую, это ptsinproc=(/61,60/)
, x_slab_displs=(/0,61/)
. myminpt
- простое целое число, дающее минимальный индекс, обрабатываемый в каждой процедуре.
Итак, теперь я хочу собрать все f
в процесс 0, и я запускаю
if (myrank == 0) then
call mpi_gatherv(MPI_IN_PLACE, ptsinproc(myrank),
+ mpi_x_interface, f(1,1,1,1), ptsinproc,
+ x_slab_displs, mpi_x_interface, 0,
+ mpi_comm_world, mpi_err)
else
call mpi_gatherv(f(myminpt,1,1,1), ptsinproc(myrank),
+ mpi_x_interface, f(1,1,1,1), ptsinproc,
+ x_slab_displs, mpi_x_interface, 0,
+ mpi_comm_world, mpi_err)
endif
Я могу отправить не более одной такой "плиты". Если я попытаюсь отправить все 60 «блоков» из процесса 1 в процесс 0, я получу ошибку сегмента из-за «недопустимой ссылки на память». Кстати, даже когда я отправляю этот единственный кусок, данные оказываются не в том месте.
Я проверил все очевидные вещи, такие как maiking, и убедитесь, что myrank, ptsinproc и x_slab_dislps - это то, что они должны быть во всех процессах. Я изучал разницу между «размером» и «протяженностью» и так далее, но безрезультатно. Я на грани своего остроумия. Я просто не понимаю, что делаю неправильно. И кто-то может вспомнить, что я задал похожий (но другой!) Вопрос несколько месяцев назад. Признаюсь, я просто не понимаю. Мы ценим ваше терпение.
OPENMPI
реализациюMPI
, убедитесь, что у вас установлена последняя возможная версия или, по крайней мере, версия выше, чем1.8.5
. Было много проблем сMPI_IN_PLACE
вOPENMPI
. Вы можете проверить open-mpi.org/source/new.php и выполнить поискMPI_IN_PLACE
, чтобы узнать, сколько раз исправлялись проблемы, связанные сMPI_IN_PLACE
. Простая проверка будет заключаться в заменеMPI_IN_PLACE
фактическим буфером. - person innoSPG   schedule 08.02.2016mpi_
. - person Hristo Iliev   schedule 09.02.2016