В программах на c ++ и Fortran используются библиотека ядра Intel Math и openmpi. Ошибка компоновки скалярного пакета возникает при компиляции программы под Linux. как решить эту проблему?
Программа должна иметь ссылку на библиотеку ядра Intel Math и версию MPI Open-MPI, построенную на базе Intel Fortran и C
! ---------------------------------------------- -------------------------------------------------- -----------------------------------
подпрограмма mpi_worker_ScaLapackMM ()
! ------------------------------------------------- -------------------------------------------------- --------------------------------
!
! Matrix Matrix Multiply
!
integer :: i, istat, numroc, info, ictxt
integer :: myid, ierr, nprocs
integer :: mycol, myrow, nb
integer :: npcol, nprow
integer,parameter :: descriptor_len=9
integer :: l_nrows_wj,l_ncols_wj
integer :: l_nrows_wjtwj,l_ncols_wjtwj
integer :: desc_wj( descriptor_len ),desc_wjg( descriptor_len )
integer :: desc_wjtwj( descriptor_len )
integer :: desc_wjtwjg( descriptor_len )
integer :: rootNodeContext, sizeM, sizeN
real(RealPrec), dimension(:,:),allocatable :: wj_loc,wjtwj_loc
!
! Какой процессор у меня есть и сколько там других?
!
вызовите blacs_pinfo (myid, nprocs)
!
! Размер матрицы вещания для всех процессоров:
!
if (myid == 0) sizeM = size (wj, dim = 1)
if (myid == 0) sizeN = size (wj, dim = 2)
вызовите mpi_bcast (sizeM, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
вызовите mpi_bcast (sizeN, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
!
! Установите размерность сетки 2d процессоров:
!
вызвать gridsetup (nprocs, nprow, npcol)
! Маленькая сетка процессора, короткая, тонкая подстройка матрицы:
! Это для НЕКОТОРЫХ процессоров (таких как Triton), где pdsyrk останавливается для жирных матриц и небольших сеток
если ((nprocs <= 16) .и. (sizeN / sizeM> 2)), то
nprow = 1
npcol = nprocs
ENDIF
!
! Инициализируйте единственный контекст blacs:
!
вызов blacs_get (-1,0, ictxt)
вызовите blacs_gridinit (ictxt, 'r', nprow, npcol)
вызов blacs_gridinfo (ictxt, nprow, npcol, myrow, mycol)
!
! Рассчитаем коэффициент блокировки для матрицы:
!
блок набора вызовов (nb, 64, sizeM, sizeN, nprow, npcol)
!
! Распределенные матрицы: получите num. местные строки / столбцы. Создать описание:
!
l_nrows_wj = numroc (размер M, nb, myrow, 0, nprow)
l_ncols_wj = numroc (размер N, nb, mycol, 0, npcol)
вызов descinit (desc_wj, sizeM, sizeN, nb, nb, 0, 0, ictxt, l_nrows_wj, info)
l_nrows_wjtwj = numroc(sizeN,nb,myrow,0,nprow)
l_ncols_wjtwj = numroc(sizeN,nb,mycol,0,npcol)
call descinit( desc_wjtwj, sizeN, sizeN, nb, nb, 0, 0, ictxt, l_nrows_wjtwj, info )
allocate (wj_loc(l_nrows_wj, l_ncols_wj ), stat=istat)
if (istat /= 0) then
write(*,*) 'Error allocating wj_loc! l_nrows_wj,l_ncols_wj =',l_nrows_wj,l_ncols_wj
stop
endif
allocate (wjtwj_loc(l_nrows_wjtwj, l_ncols_wjtwj ), stat=istat)
if (istat /= 0) then
write(*,*) 'Error allocating wjtwj_loc! l_nrows_wjtwj,l_ncols_wjtwj =',l_nrows_wjtwj, l_ncols_wjtwj
stop
endif
!
! Распределите подблоки глобального wj от мастера ко всему процессу:
!
вызовите blacs_get (-1, 0, rootNodeContext)
вызов blacs_gridinit (rootNodeContext, 'row-major', 1, 1)
if (myid == 0) then
call descinit( desc_wjg, sizeM, sizeN, sizeM, sizeN, 0, 0, rootNodeContext, sizeM, info )
call descinit( desc_wjtwjg, sizeN, sizeN, sizeN, sizeN, 0, 0, rootNodeContext, sizeN, info )
else
desc_wjg = 0
desc_wjg(2) = -1
desc_wjtwjg = 0
desc_wjtwjg(2) = -1
endif
call pdgemr2d( sizeM, sizeN, wj, 1, 1, desc_wjg, wj_loc, 1, 1, desc_wj, desc_wj( 2 ) )
!
! Параллельная матрица умножается:
!
вызов pdsyrk ('u', 't', sizeN, sizeM, 1d0, wj_loc, 1,1, desc_wj, 0d0, wjtwj_loc, 1,1, desc_wjtwj)
!
! Отправить решение в wjtwj_loc обратно в матрицу wjtwj:
!
call pdgemr2d( sizeN, sizeN, wjtwj_loc, 1, 1, desc_wjtwj, wjtwj, 1, 1, desc_wjtwjg, ictxt )
if (myid == 0) then
! fill in lower triangle
do i=2,sizeN
wjtwj(i,1:i-1) = wjtwj(1:i-1,i)
enddo
endif
if (myid == 0) call blacs_gridexit( rootNodeContext )
!
! Освободить локальные массивы ...
!
if (allocate (wj_loc)) освобождает (wj_loc)
if (allocate (wjtwj_loc)) освобождает (wjtwj_loc)
!
! Отключить блаки:
!
вызов blacs_gridexit (ictxt)
end subroutine mpi_worker_ScaLapackMM
! ---------------------------------------------- -------------------------------------------------- -----------------------------------
подпрограмма mpi_worker_ScaLapackMS (istat)
! ------------------------------------------------- -------------------------------------------------- --------------------------------
!
! Матричная Факторизация и Решить
!
! Это вызывается из solveLinearSystem_scalapack () в mare2dem_mpi.f90.
!
integer :: numroc, info,ictxt
integer :: myid, ierr, nprocs, istat
integer :: mycol, myrow, nb
integer :: npcol, nprow
integer,parameter :: descriptor_len=9
integer :: l_nrows_amat,l_ncols_amat
integer :: l_nrows_pm_test,l_ncols_pm_test
integer :: desc_amat( descriptor_len )
integer :: desc_pm_test( descriptor_len )
integer :: desc_amatg( descriptor_len )
integer :: desc_pm_testg( descriptor_len )
integer :: rootNodeContext, sizeN
real(RealPrec), dimension(:,:),allocatable :: amat_loc
real(RealPrec), dimension(:,:) ,allocatable :: pm_test_loc
!
! Какой процессор у меня есть и сколько там других?
!
вызовите blacs_pinfo (myid, nprocs)
!
! Размер матрицы широковещания N x N для всех узлов:
!
if (myid == 0) sizeN = size (amat, dim = 1)
вызовите mpi_bcast (sizeN, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
!
! Установите размерность сетки 2d процессоров:
!
вызов gridsetup (nprocs, nprow, npcol)
!
! Инициализируйте единственный контекст blacs:
!
вызов blacs_get (-1,0, ictxt)
вызовите blacs_gridinit (ictxt, 'r', nprow, npcol)
вызов blacs_gridinfo (ictxt, nprow, npcol, myrow, mycol)
!
! Рассчитаем коэффициент блокировки для матрицы:
!
блокировать вызовы (nb, 64, sizeN, sizeN, nprow, npcol)!
!
! Распределенные матрицы: получите num. местные строки / столбцы. Создать описание:
!l_nrows_amat = numroc (sizeN, nb, myrow, 0, nprow) l_ncols_amat = numroc (sizeN, nb, mycol, 0, npcol) вызвать десцинит (desc_amat, sizeN, sizeN, nb, nb, 0, 0, ictxt, l_nrows_amat, информация)
l_nrows_pm_test = numroc(sizeN,nb,myrow,0,nprow)
l_ncols_pm_test = 1
call descinit( desc_pm_test, sizeN, 1, nb, 1, 0, 0, ictxt, l_nrows_pm_test, info )
allocate (amat_loc(l_nrows_amat, l_ncols_amat ), stat=istat)
if (istat /= 0) then
write(*,*) 'Error allocating amat_loc! l_nrows_amat,l_ncols_amat =',l_nrows_amat,l_ncols_amat
stop
endif
allocate (pm_test_loc(l_nrows_pm_test, l_ncols_pm_test ), stat=istat)
if (istat /= 0) then
write(*,*) 'Error allocating pm_test_loc! l_nrows_pm_test,l_ncols_pm_test =',l_nrows_pm_test,l_ncols_pm_test
stop
endif
!!Распределите подблоки глобальных amat и pm_test от мастера ко всему процессу:!вызывать blacs_get (-1, 0, rootNodeContext) вызывать blacs_gridinit (rootNodeContext, 'row-major', 1, 1) if (myid == 0), затем вызывать descinit (desc_amatg, sizeN, sizeN, sizeN, sizeN, 0, 0,rootNodeContext, sizeN, info) вызывает descinit (desc_pm_testg, sizeN, 1, sizeN, 1, 0, 0, rootNodeContext, sizeN, info), в противном случае desc_amatg = 0 desc_amatg (2) = -1 desc_pm_testg = 0 desc_pm_testg (2) = -1endif
call pdgemr2d( sizeN, sizeN, amat, 1, 1, desc_amatg, amat_loc, 1, 1, desc_amat, desc_amat( 2 ) )
call pdgemr2d( sizeN, 1, pm_test, 1, 1, desc_pm_testg, pm_test_loc, 1, 1, desc_pm_test, desc_pm_test( 2 ) )
!!Решатель параллельных матриц:вызовите pdpotrf ('u', sizeN, amat_loc, 1, 1, desc_amat, info) if (info / = 0), а затем написать (, ) 'Ошибка вызова pdpotrf!info: ', info stop endif
call pdpotrs( 'u', sizeN, 1, amat_loc, 1, 1, desc_amat, pm_test_loc, 1, 1, desc_pm_test, info )
if (info /= 0) then
write(*,*) 'Error calling pdpotrs! info: ',info
stop
endif
!!Отправить решение в векторе обратно мастеру:!
вызвать pdgemr2d (sizeN, 1, pm_test_loc, 1, 1, desc_pm_test, pm_test, 1, 1, desc_pm_testg, ictxt)
if (myid == 0) call blacs_gridexit( rootNodeContext )
!!Освободить локальные массивы ...!if (allocate (amat_loc)) deallocate (amat_loc) if (allocate (pm_test_loc)) deallocate (pm_test_loc)
!!Завершение работы блоков:!
вызов blacs_gridexit (ictxt)
end subroutine mpi_worker_ScaLapackMS
endif
Отображаемый результат компиляции по make:
mpif90 -O2 -fpp -m64kdtree2.o fem2D_utilities.o binaryTree.o call_triangle.o sort.o c_fortran_zgssv.o superlu_zsolver.o umf4_f77zwrapper.o umfpack_zsolver.o string_helpers.o треугольник. o mt.o mare2dem_common.o spline_kx_module.o mare2dem_worker.o mare2dem_io.o mare2dem_mpi.o EM2D.o RunMARE2DEM.o ./libraries/SuperLU_4.0/libsuperlu_4.0.a ./libraumaбиблиотеки / SuiteSparse / AMD / Lib / libamd.a ./libraries/SuiteSparse/CHOLMOD/Lib/libcholmod.a ./libraries/SuiteSparse/COLAMD/Lib/libcolamd.a ./libraries/SuiteSparse/CAMD/La/lib./libraries/SuiteSparse/CCOLAMD/Lib/libccolamd.a ./libraries/metis-4.0/libmetis.a ./libraries/scalapack-2.0.2/libscalapack.a \ -L / home / users / nqiu / intel / mkl/ lib / intel64 / -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -o MARE2DEM Occam.o: в функции occam_mp_mpi_worker_scalapackmm_':
Occam.f90:(.text+0x1278a): undefined reference to
numroc_ 'Occam.f90 :(. text + 0x127a9): неопределенная ссылка на numroc_'
Occam.f90:(.text+0x127e1): undefined reference to
descinit_' Occam.f90 :(. text + 0x12801): неопределенная ссылка наnumroc_'
Occam.f90:(.text+0x12820): undefined reference to
numroc_ 'Occam.f90 :(. Text + 0x12857): неопределенная ссылка на descinit_'
Occam.f90:(.text+0x12c37): undefined reference to
pdgemr2d_' Occam.f90 :(. Text + 0x12c88): неопределенная ссылка на pdsyrk_'
Occam.f90:(.text+0x12cd4): undefined reference to
pdgemr2d_ 'Occam.f90 :(. Text+ 0x13127): неопределенная ссылка на descinit_'
Occam.f90:(.text+0x1315d): undefined reference to
descinit_ 'Occam.o: в функции occam_mp_mpi_worker_scalapackms_':
Occam.f90:(.text+0x134dd): undefined reference to
numroc_' Occam.f90 :(. Text + 0x13510): неопределенная ссылка на numroc_'
Occam.f90:(.text+0x1355b): undefined reference to
descinit_ 'Occam.f90 :(. Text +0x1358b): неопределенная ссылка на numroc_'
Occam.f90:(.text+0x135da): undefined reference to
descinit_ 'Occam.f90 :(. Text + 0x139e2): неопределенная ссылка на pdgemr2d_'
Occam.f90:(.text+0x13a2f): undefined reference to
pdgemr2d_' Occam.f90 :(. Text + 0x13a61): неопределенная ссылка на pdpotrf_'
Occam.f90:(.text+0x13ada): undefined reference to
pdpotrs_ 'Occam.f90 :(. text + 0x13b41): неопределенная ссылка на pdgemr2d_'
Occam.f90:(.text+0x13f4e): undefined reference to
descinit_ 'Occam.f90 :(. text + 0x13f8b): неопределенная ссылка на `descinit _'