- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
My ifort compiler version 15.0.0, in composer_xe_2015.6.233, linux platform.
I built libblas95.so from MKL source with two changes in published makefile (MKL/interfaces/blas95/makefile):
1. Add -fPIC while build %.o from %.f90;
2. Add -fPIC -shared flag while generate libblas95.so;
My source code(there may have some type error for i can't paste directly):
MODULE mod_local_mkl_proc
USE blas95, only : dot, nrm2
USE f95_precision
IMPLICIT NONE
PUBLIC calc_dihedral
INTERFACE calc_dihedral
MODULE PROCEDURE calc_dihedral_4
END INTERFACE
INTERFACE local_cross_product
MODULE PROCEDURE local_vv_cp_4
END INTERFACE
CONTAINS
SUBROUTINE local_vv_cp_4(cros, lv, rv)
REAL(4) :: cros(3)
REAL(4), INTENT(in) :: lv(3), rv(3)
cros(1) = lv(2) * rv(3) - lv(3)*rv(2)
cros(2) = lv(3) * rv(1) - lv(1)*rv(3)
cros(3) = lv(1) * rv(2) - lv(2)*rv(1)
END SUBROUTINE
SUBROUTINE calc_dihedral_4(dihedral, coor1, coor2, coor3, coor4)
REAL(4), INTENT(inout) :: dihedral
REAL(4), INTENT(in) :: coor1(3), coor2(3), coor3(3), coor4(3)
! locals
REAL(4) :: delt12(3), delt23(3), delt34(3), len23, uni23(3), &
d12, d23, norm_v1(3), norm_v2(3), orien_v(3)
! init
orien_v = (/1.0, 1.0, 1.0/)
delt23 = (/1.0, 1.0, 1.0/)
! omit Call math_dihedral_4, without this call, the error occurs too
!
delt12 = coor2 - coor1
delt23 = coor3 - coor2
delt34 = coor4 - coor3
!
! ATTENTION here:
! without this print statement, the segmentation fault occurs.
!
PRINT *, delt23(1), delt23(2), delt23(3)
len23 = nrm2(delt23)
uni23 = delt23 / len23
d12 = dot(delt12, delt23)
d23 = dot(delt34, delt23)
norm_v1 = delt12 - uni23 * d12 /len23
norm_v2 = delt34 - uni23 * d23 /len23
CALL local_cross_product(orien_v, norm_v1, norm_v2)
orien_v = orien_v * delt23
IF (orien_v(1) >= 0. .AND. orien_v(2) >= 0. .AND. orien_v(3) >= 0.) THEN
dihedral = -dihedral
END IF
END SUBROUTINE
END MODULE
PROGRAM main
USE mod_local_mkl_proc, ONLY: calc_dihedral
IMPLICIT NONE
! locals
REAL(4) :: dih, coor1(3), coor2(3), coor3(3), coor4(3)
! init
coor1 = (/0., 1., 0./)
coor2 = (/0., 0., 0./)
coor3 = (/1., 0., 0./)
coor4 = (/1., 1., 1./)
dih = 0
PRINT *, "init"
! process
CALL calc_dihedral(dih, coor1, coor2, coor3, coor4)
PRINT *, dih
PRINT *, "calc_dihedral done."
! end
PRINT *, "done."
END PROGRAM
The .o build options is blow:
ifort -g -fPIC -shared -check bound -gcc-name=gcc -I{MKL_INC_FLAGS} -O3 -c *.f90
The binary link flags:
ifort -o test.bin $^ -Wl,--start-roup $(LIB_INC_FLAGS) -lblas95 -lmkl_avx2 -lmkl_intel_lp64 \
-lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -Wl,--end-group
Error info with gdb> run:
Program received signal SIGSEGV, Segmentation fault.
#0 0x00007fffef790606 in LInc1_X16_Loop2gas_1 () from /opt/intel/.../mkl/lib/intel64/libmkl_avx.so
#1 0x00007fffffffc320 in ?? ()
#2 0x0000000000000000 in ?? ()
Use ldd test.bin, stange things found:
test.bin does NOT require libmkl_avx.so, but require libmkl_avx2.so.
When i delete the PRINT statement in function calc_dihedral_4, everything goes well, this really confused me.
What's real problem with my code, could anyone help?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Can anyone help?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You should probably ask in the MKL forum, but I'll comment that you're three years out of date on the product. Can you try a newer compiler and MKL? That removing the PRINT statement changes the behavior might indicate a compiler bug or might be a bug in your program referencing uninitialized storage.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Steve Lionel (Ret.) wrote:
You should probably ask in the MKL forum, but I'll comment that you're three years out of date on the product. Can you try a newer compiler and MKL? That removing the PRINT statement changes the behavior might indicate a compiler bug or might be a bug in your program referencing uninitialized storage.
Thanks Steve, i'll try a new version later.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page