|
이제 그냥 여기서 끝장을 봐야겠습니다. 댓글만 길어지고, 해결은 안된듯 하셔서 그냥 이거 한방으로 완전히 마무리 지었으면 좋겠습니다.
일단 가장 큰 이유는 FFTW 라이브러리의 의존성 문제 때문입니다. 주미님이 말씀하신 PSCF 프로그램은 컴파일 시, FFTW의 헤더에 노출된 관련 명령어들을 사용하도록 하고, 실행시 FFTW 라이브러리를 동적으로 링크하도록 함으로써 fast-fourier transform 연산을 수행합니다. 우선 왠만한 리눅스 배포판이라면 FFTW가 패키지로 제공됩니다. 테스트 결과로는 Ubuntu, Fedora 심지어는 Gentoo나 FreeBSD에서도 컴파일을 할 수 있었습니다. 그런데 CentOS나 RHEL 5에서는 이상하게도 FFTW가 해당 레포지터리에 존재하지 않는다고 나옵니다(CentOS의 경우에는 http://ftp.daum.net에서 제공하는 레포지터리를 확인했습니다) 따라서 CentOS나 RHEL에서는 FFTW 라이브러리를 직접 소스 컴파일로 설치하거나, rpmfind에서 찾은 fftw 패키지를 설치 해주어야 했습니다. 소스 컴파일을 통해 설치하려면 앞서 제가 남긴 답글에서처럼 ./configure에 적절한 옵션을 함께 주어서 portable binary로 내보내도록 옵션을 주어야 했습니다. 결국 주미님이 계속 헤매시고 있는 근본적인 이유는 바로 FFTW 라이브러리를 제대로 사용하지 못하는 문제로 인한 것입니다.
이를 쉽고 간단하게 해결하기 위해서 Intel Fortran Compiler for Linux를 소개드립니다. 자체 Math Kernel Library를 통한 고속 LAPACK, BLAS 연산을 지원하며 자체적으로 FFT 명령어를 제공하므로 FFTW 라이브러리 의존성 문제를 줄일 수 있고, OpenMP 및 SSE지원을 통한 속도 향상을 경험하실 수 있습니다. 원래 Intel Compiler Suite의 일부분으로 제공되는 Intel Fortran Compiler는 Linux 용의 경우 개인적인 목적이라면 무료로 제공됩니다. 그리고 Eclipse와의 통합을 지원하는 플러그인도 쉽게 사용가능하죠.
일단 긴 얘기는 각설하고 아래 링크를 통해서 현재 사용하시는 architecture에 맞게 Intel Fortran Compiler for Linux를 다운로드 받으시길 바랍니다.
Intel Fortran Compiler for Linux 11.1.046
architecture - ia32 (i386/i586/i686 개발용)
http://registrationcenter-download.intel.com/akdlm/irc_nas/1539/l_cprof_p_11.1.046_ia32.tgz
architecture - intel 64 (x86_64 개발용)
http://registrationcenter-download.intel.com/akdlm/irc_nas/1539/l_cprof_p_11.1.046_intel64.tgz
architecture - ia64 (Itanium 64 개발용)
http://registrationcenter-download.intel.com/akdlm/irc_nas/1539/l_cprof_p_11.1.046_ia64.tgz
다운받으셔서 압축을 해제하시고 ./install.sh 명령어로 설치가 가능합니다. 설치는 root 권한으로 이루어져야 합니다. 몇가지 단계를 거치는데, 별로 어려운 내용이 아니므로 크게 무리는 없을 듯 합니다. 설치 도중에 Serial Number를 요구합니다. 제가 다운로드받으면서 제공받은 다음과 같습니다. (무료로 제공되므로 크게 상관없을 듯 합니다)
serial : NB3L-PMHW76B8
설치가 완료되면 MKL라이브러리를 포함한 시스템 라이브러리 캐시를 재생성하기 위해서 Intel Fortran Compiler의 라이브러리를 참조하도록 만들어줍니다. (이 과정은 root 권한이 필요합니다)
[root@cfdlab-node38 ~]$ cd /etc/ld.so.conf.d
[root@cfdlab-node38 ld.so.conf.d]$ touch ifortcom.conf
[root@cfdlab-node38 ld.so.conf.d]$ vi ifortcom.conf
위와 같이 입력하시면 해당 파일을 수정할 수 있습니다. I 혹은 <Insert>키를 누르신다음 다음 내용을 입력합니다.
/opt/Intel/Compiler/11.1/046/lib/<arch>
/opt/Intel/Compiler/11.1/046/mkl/lib/<arch>
<arch>는 사용하시는 architecture에 따라 다릅니다. 예를 들어서 ia32용을 다운받으셔서 설치했다면 ia32이고, intel64용 컴파일러를 설치했다면 intel64로 입력해주시면 됩니다. 그런 다음 이제 ldconfig로 라이브러리 캐쉬를 재설정합니다.
[root@cfdlab-node38 ld.so.conf.d]$ ldconfig -c /etc/ld.so.conf
이렇게 입력하시면 참조 가능한 라이브러리의 위치 및 캐쉬가 재생성됩니다. 따라서 실행시 혹은 컴파일 시 해당 라이브러리 참조를 쉽게 찾을 수 있도록 할 수 있습니다. 이제 환경 설정을 하겠습니다. 환경 설정은 크게 2가지로 나뉩니다. Intel Fortran Compiler의 환경 설정과 실행 경로 설정입니다. 우선 Intel Fortran Compiler를 위한 환경 설정을 하도록 하겠습니다.
우선 root가 아닌 사용자 계정으로 돌아가신 다음, 다음을 입력합니다.
[root@cfdlab-node38 ld.so.conf.d]$ exit
[cfdfx3@cfdlab-node38 ld.so.conf.d]$ cd ~
[cfdfx3@cfdlab-node38 ~]$ vi .bashrc
.bashrc는 터미널이 시작될 때의 사용자 환경 설정을 제어할 수 있는 부분입니다. 모든 사용자를 위한 환경설정은 /etc/.profile파일을 편집해주어야 합니다. 제일 마지막 줄로 가셔서 다음과 같이 입력해줍니다.
export PATH=$PATH:/opt/Intel/Compiler/11.1/046/bin/<arch>
<arch>는 이전에 설명한 그대로 입니다. 저장은 <esc> 키를 한번 눌러주시고, :wq라고 입력하시면 됩니다. (자세한건 vi사용법을 참조하세요) 저장이 완료되고 vi가 종료되었다면 현재의 터미널 창을 종료하고 다시 시작합니다. 그리고 다음을 입력합니다.
[cfdfx3@cfdlab-node38 ~]$ ifort --version
ifort (IFORT) 11.1 20090630
Copyright (C) 1985-2009 Intel Corporation. All rights reserved.
위와 같이 버전에 대한 정보가 나온다면 제대로 설정된 것입니다. 그럼 Intel Fortran Compiler를 위한 환경 설정 쉘 스크립트를 실행합니다.
[cfdfx3@cfdlab-node38 ~]$ ifortvars_ia32.sh
이렇게 해주시면 이제 기타 라이브러리 및 인클루드 파일 설정이 완료됩니다. 이제 컴파일러가 제대로 동작할 수 있는 환경은 모두 되어 있는 셈입니다. 그러면 이제 어디서나 PSCF가 실행되도록 하기 위해서 사용자 디렉토리에 bin 디렉터리를 만들도록 하겠습니다.
[cfdfx3@cfdlab-node38 ~]$ mkdir bin
이렇게 해두시면 기본적으로 사용자 컴파일 된 바이너리를 어디서나 실행하도록 하겠다는 의미가 되기 때문에 좀 더 쉽게 프로그램을 실행하실 수 있습니다. 일반적으로 /home/<user-name>/bin 디렉토리가 사용자용 바이너리 파일이 존재하는 경로로 지정되어 있기 때문에 그렇습니다.
이제 컴파일을 하기 위한 Makefile을 살짝 수정해보도록 하겠습니다. 우선 제가 업로드한 Makefile을 다운로드 받으셔서 pscf/src/build 디렉토리에 복사합니다. (기존에 쓰시던 파일이 있다면 백업해 둡니다) 제가 다음 두 줄을 추가하였습니다.
Line 6 : MKL=/opt/intel/Compiler/11.1/046/mkl/lib/32
Line 7 :MKL_INCLUDE=/opt/intel/Compiler/11.1/046/mkl/include
대충 보시면 아시겠지만 MKL의 마지막 32만 수정해주시면 됩니다. 즉, 현재 architecture에 따라 다른 것이기 때문에 만약 intel64버전을 설치하실 것이라면 64로 변경만 해주시면 문제 없이 컴파일 됩니다.
이제 마지막으로 컴파일 된 바이너리가 들어간 경로를 지정해주는 부분이 있습니다.
Line 12 : BIN=~/bin
이것도 금방 이해가실겁니다. 즉, 사용자 홈디렉토리 아래의 bin 디렉토리에 컴파일된 바이너리를 저장하겠다는 의미로 보시면 됩니다. 이제 Makefile 수정이 완료되었으므로 저장을 해주시면 되겠습니다.
그럼 이제 컴파일을 해봅니다.
[cfdfx3@cfdlab-node38 ~]$ cd ./pscf/src/build
[cfdfx3@cfdlab-node38 build]$ make -B pscf
-B 옵션은 기존의 object code가 있더라도 모두 새로 컴파일 하겠다는 의미입니다. 그냥 싹 새로 컴파일 해줍니다. 그러면 아무 문제 없이 컴파일 된다는 것을 알 수 있을 것입니다. 실제로 Makefile은 원래와는 달리 여러가지 옵션이 붙어 있는 상태입니다만, 어렵지는 않을 것입니다. 단지 어떤 컴파일러를 사용할 것인지, 어떤 라이브러리를 사용할 것인지에 대해서만 좀 붙여주었을 뿐, 그 외에는 대동소이 합니다. 그러면 자연스럽게 컴파일 된 pscf 파일은 /home/<user-name>/bin 폴더에 있게 됩니다. 제가 주미님 글에 댓글로 남겼지만 root로의 컴파일은 되도록이면 자제하시는 것이 좋습니다;;;;;
컴파일이 완료되면 해당 바이너리의 의존성을 확인해 봅니다. 즉 어떤 라이브러리를 필요로 하는지 알아보는 것입니다. 쉘에서 다음을 입력해봅니다.
[cfdfx3@cfdlab-node38 build]$ ldd ~/bin/pscf
linux-gate.so.1 => (0x005b8000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00b5c000)
libmkl_intel.so => /opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.so (0x0034c000)
libmkl_sequential.so => /opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_sequential.so (0x00110000)
libmkl_core.so => /opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.so (0x00775000)
libm.so.6 => /lib/libm.so.6 (0x00b2b000)
libc.so.6 => /lib/libc.so.6 (0x005b9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x04522000)
libdl.so.2 => /lib/libdl.so.2 (0x00b55000)
/lib/ld-linux.so.2 (0x00994000)
[cfdfx3@cfdlab-node38 build]$
자세히 보시면, FFTW 라이브러리를 전혀 필요로 하지 않는다는 것을 알 수 있습니다. Intel Fortran Compiler에서 자체적으로 FFT 명령어를 지원하기 때문입니다. 단지 필요한 것은 Intel Fortran Compiler에서 제공하는 Math Kernel Library의 LAPACK과 BLAS를 이용하기 위한 라이브러리 3개가 필요할 뿐입니다.밑줄 친 부분이 바로 그것이죠. 아마 64비트 환경이시라면 64비트 환경에 맞추어서 /usr/lib64나 mkl/lib/64 이런 식으로만 나올 뿐 전체적인 내용은 비슷하게 나오게 됩니다. 이제 예제 파일을 실행해서 문제없이 돌아가는지 확인해 보겠습니다. 저는 pscf/examples/ITERATE/ABCbcp/hex/1 에 있는 예제를 실행해 보겠습니다.
[cfdfx3@cfdlab-node38 ~]$ cd ./pscf/examples/ITERATE/ABCbcp/hex/1
[cfdfx3@cfdlab-node38 1]$ pscf < in
format 1 0
MONOMERS
N_monomer
3
kuhn
1.0000000000E+00 1.0000000000E+00 1.0000000000E+00
CHAINS
N_chain
1
N_block
3
block_monomer
1 2 3
block_length
2.4900000000E-01 5.0200000000E-01 2.4900000000E-01
SOLVENTS
N_solvent
0
COMPOSITION
ensemble
0
phi_chain
1.0000000000E+00
INTERACTION
interaction_type
'chi'
chi
1.3000000000E+01
3.5000000000E+01 1.3000000000E+01
UNIT_CELL
dim
2
crystal_system
'hexagonal'
N_cell_param
1
cell_param
1.8692514000E+00
DISCRETIZATION
ngrid
18 18
chain_step
1.0000000000E-02
FILE_PREFIXES
input_prefix
'in.'
output_prefix
''
BASIS
group_name
'p 6 m m'
N_star
37
ITERATE
N_star in field file
374
max_itr
300
error_max
1.0000000000E-08
domain
T
itr_algo
'NR'
N_cut
60
************************************
Iteration 0
error = 3.1002576338E-04
stress = 7.8983771199E-07
cell_param = 1.8692514000E+00
f_Helmholtz = 4.0926783489E+00
Initializing Jacobian ...
Inverting Jacobian ...
Iteration 1
error = 3.0321539658E-08
stress = -3.0321539658E-10
cell_param = 1.8692502766E+00
f_Helmholtz = 4.0926783885E+00
Minimum lambda in line search reached.
Iteration 2
error = 2.3995920208E-13
stress = 2.3995920208E-15
cell_param = 1.8692502770E+00
f_Helmholtz = 4.0926783886E+00
FINISH
[cfdfx3@cfdlab-node38 1]$
네 대략 3번만에 수렴해서 결과가 나오더군요. 중간에 Jacobian 계산이 오래 걸리는 듯 했습니다만, 그 이후로는 일사천리로 진행되었습니다. 잘 돌아가는 것도 확인했습니다. 이 결과는 주미님이 돌려보셨을 때 같은 결과가 나오는지의 여부를 확인해 보기 위한 것입니다. 문제가 있다면 말씀해주세요.
제 글이 많은 도움이 되었으면 좋겠습니다. 최종 Makefile이 포함된 소스 파일과 컴파일된 바이너리 함께 업로드합니다. 바이너리는 ia32환경에서 컴파일되었습니다.
|