2017-01-04 7 views
1

Я пытаюсь разделить код 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 для каждого узла. Не могли бы вы помочь мне заставить его работать? Спасибо!

+1

Я думаю, вам нужно использовать функцию IMSL ('mp_setup()'), чтобы инициализировать mpi, а не делать это самостоятельно. См. [Здесь] (https://www.sharcnet.ca/help/index.php/IMSL#Using_IMSL.27s_Built-in_MPI_Functionality) для примера - я не могу это проверить, поэтому не хочу публиковать его как ответ. –

+0

Почему вы используете 'integer (kind = 4)' вместо простого 'integer'? Не только он менее портативен и уродлив, но и намного дольше ... –

+0

hi d_1999, я тестировал с помощью функции IMSL (mp_setup()), и программа застряла где-то. Однако я нашел решение в ссылке, которую вы мне дали. Используя флаг $ LINK_MPIS (не $ LINK_MPI), я могу использовать общие подпрограммы MPI с IMSL. Большое спасибо! Если вы хотите, вы можете разместить его как asnwer. –

ответ

0

И наконец, d_1999 предоставил link, который дает мне достаточно информации для решения этой проблемы. Мне просто нужно изменить флаг ссылки на $ LINK_MPIS, а затем я могу запустить второй пример кода без каких-либо проблем.