Ошибка компоновки скалярного пакета возникает при компиляции программы под Linux. Как решить эту проблему? - PullRequest
0 голосов
/ 16 мая 2019

В программах на 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 _'

...