Я пытаюсь разделить код fortran на несколько частей, и я хочу распараллелить каждую часть с помощью MPI. Для каждой части я использую библиотеку IMSL для решения проблемы оптимизации (используйте BCONF). Тем не менее, я обнаружил, что библиотека IMSL имеет свои собственные подпрограммы об MPI и не позволяет мне вызывать стандартную подпрограмму запуска MPI «Call MPI_INIT (ierror)». Это просто дает мне фатальную ошибку и заканчивает программу.Конфликт между IMSL и MPI
Приведем два примера, иллюстрирующие проблему.
Пример 1, печать "Hello World" от каждого узла:
program main
use mpi
implicit none
integer (kind = 4) error
integer (kind = 4) id
integer (kind = 4) p
call MPI_Init (error)
call MPI_Comm_size (MPI_COMM_WORLD, p, error)
call MPI_Comm_rank (MPI_COMM_WORLD, id, error)
write (*, *) ' Process ', id, ' says "Hello, world!"'
call MPI_Finalize (error)
end program
Когда я компиляции и запуска без IMSL библиотеки, это дает мне правильный ответ:
mpif90 -o a.out hello_mpi.f90
mpiexec -n 4 ./a.out
Process 3 says "Hello, world!"
Process 0 says "Hello, world!"
Process 2 says "Hello, world!"
Process 1 says "Hello, world!"
Теперь если я меняю ничего не вводить в код, но просто добавить библиотеку IMSL, это приведет к ошибке:
mpif90 -o a.out hello_mpi.f90 $LINK_FNL_STATIC_IMSL $F90FLAGS
mpiexec -n 4 ./a.out
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
В первом примере, чанг ING «$ LINK_FNL_STATIC_IMSL» на «LINK_MPI» вылечить эту проблему, но она не работает в более реалистичный пример здесь:
Пример 2: использование MPI и каждого узла библиотеки использование IMSL для вычисления квадратурных узлов
program main
USE GQRUL_INT
use mpi
implicit none
integer (kind = 4) error
integer (kind = 4) id
integer (kind = 4) p
real (kind = 8) QW(10), QX(10)
call MPI_Init (error)
call MPI_Comm_size (MPI_COMM_WORLD, p, error)
call MPI_Comm_rank (MPI_COMM_WORLD, id, error)
write (*, *) ' Process ', id, ' says "Hello, world!"'
CALL GQRUL (10, QX, QW)
call MPI_Finalize (error)
end program
Когда я компиляции и запуска, программа останавливается на «MPI_INIT»:
mpif90 -o a.out hello_mpi.f90 $LINK_FNL_STATIC_IMSL $F90FLAGS
mpiexec -n 4 ./a.out
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
Если изменить связывающую опцию $ LINK_MPI, программа вылетает на IMSL подпрограммой библиотеки:
mpif90 -o a.out hello_mpi.f90 $LINK_MPI $F90FLAGS
mpiexec -n 4 ./a.out
Process 1 says "Hello, world!"
Process 0 says "Hello, world!"
Process 3 says "Hello, world!"
Process 2 says "Hello, world!"
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007EFC178C67E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007EFC16F7BD1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007EFDE2A037E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007EFDE20B8D1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007FBF21C277E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007FBF212DCD1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007F8084FD67E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007F808468BD1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
================================================== =================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 174
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
================================================== =================================
Я запускаю этот код в системе UNIX на суперкомпьютере в моей школе, и я использую компилятор Intel и MPICH версии 3.0.1. Мой фактический код очень похож на второй пример, который использует некоторые подпрограммы IMSL для каждого узла. Не могли бы вы помочь мне заставить его работать? Спасибо!
Я думаю, вам нужно использовать функцию IMSL ('mp_setup()'), чтобы инициализировать mpi, а не делать это самостоятельно. См. [Здесь] (https://www.sharcnet.ca/help/index.php/IMSL#Using_IMSL.27s_Built-in_MPI_Functionality) для примера - я не могу это проверить, поэтому не хочу публиковать его как ответ. –
Почему вы используете 'integer (kind = 4)' вместо простого 'integer'? Не только он менее портативен и уродлив, но и намного дольше ... –
hi d_1999, я тестировал с помощью функции IMSL (mp_setup()), и программа застряла где-то. Однако я нашел решение в ссылке, которую вы мне дали. Используя флаг $ LINK_MPIS (не $ LINK_MPI), я могу использовать общие подпрограммы MPI с IMSL. Большое спасибо! Если вы хотите, вы можете разместить его как asnwer. –