'openmp'에 해당되는 글 3건

  1. 2018.10.17 [리눅스] VASP 5.4.4. 설치 - Intel MIC (Xeon Phi, 제온 파이) KNL (Knights landing) 환경
  2. 2018.10.17 [리눅스] FFTW 2.1.5 소스코드 설치 (intel compiler, intel mpi, ver. 2017)
  3. 2018.09.22 openmpi hybrid (MPI+OpenMP) 성능 문제 2

[리눅스] VASP 5.4.4. 설치 - Intel MIC (Xeon Phi, 제온 파이) KNL (Knights landing) 환경

In the world/컴퓨터 2018. 10. 17. 11:07

1. 설치 환경

CPU: Intel Skylake

OS: CentOS 7.3

컴파일러: Intel 2017 or 2018

수학라이브러리: Intel MKL 2017 or 2018

MPI: Intel MPI (impi) 2017 or 2018


2. 설치

- 소스코드 다운로드 및 압축 해제

$ tar xvzf vasp.5.4.4.tar.gz

$ cd vasp.5.4.4


- makefile.include 파일 복사

$ cp arch/makefile.include.linux_intel ./makefile.include


- makefile.include 편집


ADDITIONAL_OPTS=-O3 -qopenmp -xMIC-AVX512 -align array64byte
ADDITIONAL_OPTS_CC=-O3 -qopenmp -xCORE-AVX512

# Precompiler options
CPP_OPTIONS= -DMPI -DHOST=\"IFC15_impi\" \
-DCACHE_SIZE=12000 -Davoidalloc \
-DMPI_BLOCK=8000 -DscaLAPACK -Duse_collective \
-DnoAugXCmeta -Duse_bse_te \
-Dtbdyn -Dvasp6 \
-D_OPENMP -DPROFILING -Duse_shmem \
-Dshmem_bcast_buffer -Dsheme_rproj
CPP = fpp -f_com=no -free -w0 $*$(FUFFIX) $*$(SUFFIX) $(CPP_OPTIONS)
FC = mpiifort -qopenmp -mkl=parallel ${ADDITIONAL_OPTS}
FCL = mpiifort -mkl=parallel ${ADDITIONAL_OPTS}
FREE = -free -names lowercase
FFLAGS = -assume byterecl
OFLAG = ${ADDITIONAL_OPTS}
OFLAG_IN = $(OFLAG)
DEBUG = -O0
MKL_PATH = $(MKLROOT)/lib/intel64
BLAS =
LAPACK =
BLACS = -L$(MKLROOT)/lib/intel64 -lmkl_blacs_intelmpi_lp64
SCALAPACK = $(MKL_PATH)/libmkl_scalapack_lp64.a $(BLACS)
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o
INCS =-I$(MKLROOT)/include/fftw
LLIBS = $(SCALAPACK) $(LAPACK) $(BLAS)
OBJECTS_O1 += fft3dfurth.o fftw3d.o fftmpi.o fftmpiw.o
OBJECTS_O2 += fft3dlib.o

# For what used to be vasp.5.lib
CPP_LIB = $(CPP)
FC_LIB = $(FC)
CC_LIB = icc
CFLAGS_LIB = -O
FFLAGS_LIB = ${ADDITIONAL_OPTS}
FREE_LIB = $(FREE)
OBJECTS_LIB= linpack_double.o getshmem.o

# For the parser library
CXX_PARS = icpc
LIBS += parser
LLIBS += -Lparser -lparser -lstdc++

# # Normally no need to change this
SRCDIR = ../../src
BINDIR = ../../bin

#================================================
# GPU Stuff

CPP_GPU    = -DCUDA_GPU -DRPROMU_CPROJ_OVERLAP -DUSE_PINNED_MEMORY -DCUFFT_MIN=28 -UscaLAPACK

OBJECTS_GPU = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d_gpu.o fftmpiw_gpu.o

CC         = icc
CXX        = icpc
CFLAGS     = -fPIC -DADD_ -Wall -openmp -DMAGMA_WITH_MKL -DMAGMA_SETAFFINITY -DGPUSHMEM=300 -DHAVE_CUBLAS

CUDA_ROOT  ?= /usr/local/cuda/
NVCC       := $(CUDA_ROOT)/bin/nvcc -ccbin=icc
CUDA_LIB   := -L$(CUDA_ROOT)/lib64 -lnvToolsExt -lcudart -lcuda -lcufft -lcublas

GENCODE_ARCH    := -gencode=arch=compute_30,code=\"sm_30,compute_30\" \
                   -gencode=arch=compute_35,code=\"sm_35,compute_35\" \
                   -gencode=arch=compute_60,code=\"sm_60,compute_60\"

MPI_INC    = $(I_MPI_ROOT)/include64/ 


- 설치

$ make


끝.

:

[리눅스] FFTW 2.1.5 소스코드 설치 (intel compiler, intel mpi, ver. 2017)

In the world/컴퓨터 2018. 10. 17. 10:33
1. 설치 환경

CPU: intel skylake
OS: CentOS 7.3
컴파일러: intel 2017
MPI: impi 2017

2. 설치 과정

(1) 소스 코드 다운로드: http://www.fftw.org/download.html
(2) configure 파일 수정

- OpenMP 옵션을 intel 컴파일러 옵션에 맞게 수정
  (line 12433, 12476, 12553, 12596)

원본: CFLAGS="$save_CFLAGS -mp"
수정: CFLAGS="$save_CFLAGS -qopenmp"

- Intel MPI C 컴파일 명령어 추가
  (line 13951)

원본: for ac_prog in mpicc hcc mpcc mpcc_r mpxlc
수정: for ac_prog in mpiicc mpicc hcc mpcc mpcc_r mpxlc

(3) configure 실행

$ tar xvzf fftw-2.1.5.tar.gz
$ cd fftw-2.1.5
$ export CXX=mpiicpc
$ export CC=mpiicc
$ export F77=mpiifort
$ export FC=mpiifort
$ export F90=mpiifort
$ export CFLAGS="-O3 -ip -ftz -xCORE-AVX512 -fPIC -shared-intel"
$ export FFLAGS="-O3 -ip -ftz -xCORE-AVX512 -fPIC -shared-intel"
$ export FCFLAGS="-O3 -ip -ftz -xCORE-AVX512 -fPIC -shared-intel"
$ export CXXFLAGS="-O3 -ip -ftz -xCORE-AVX512 -fPIC -shared-intel"
$ ./configure --prefix=/opt/fftw2 \
--enable-shared=yes --enable-threads --enable-mpi --with-openmp

※ prefix 옵션은 설치할 경로로 설정

(4) 설치

$ make
$ make install

끝.


:

openmpi hybrid (MPI+OpenMP) 성능 문제

In the world/컴퓨터 2018. 9. 22. 00:50

openmpi 3.1.0 버전을 이용하여 hybrid (MPI+OpenMP) 프로그램을 실행하면 스레드 성능이 제대로 나오지 않는 문제가 발생한다.

여러가지로 테스트해본 결과 최신 버전의 openmpi는 프로세스를 코어와 할당하도록 동작시켜 여러 스레드가 하나의 코어에서 실행된다.

다음과 같이 mpirun 명령에 "--report-bindings" 옵션을 주어 프로세스가 어떻게 할당되는 지 알아 볼 수 있다.

 $ mpirun -n 2 --report-bindings ./pi_openmpi.x 

[pbcm:405591] MCW rank 0 bound to socket 0[core 0[hwt 0]]: [B/././././././././././.][./././././././././././.]

[pbcm:405591] MCW rank 1 bound to socket 0[core 1[hwt 0]]: [./B/./././././././././.][./././././././././././.]

 myrank =           0 :           1  ~    500000000

 myrank =           1 :   500000001  ~   1000000000

 numerical  pi =    3.14159265259024     

 analytical pi =    3.14159265358979     

  Error =   9.995542171736815E-010


테스트 시스템은 Intel Xeon skylake 2 소켓, 총 40 코어가 장착되어 있다.

MPI 프로세스 2 개가 발생하였고, 하나의 코어에 할당되어 있다는 것을 알 수 있다.

[B/././././././././././.] 부분에서 "B"가 프로세스가 bind 된 상태를 나타낸다. "."은 프로세스가 할당되지 않은 코어다.

당연히 프로세스 하나에 하나의 코어 만 할당되기 때문에 여러 스레드가 발생해도 성능향상이 제대로 나타나지 않는다.

이 문제를 해결하기 위해 "--map-by NUMA:PE=N" 옵션을 사용할 수 있다. 여기에서 N은 하나의 프로세스가 할당되는 코어 개수가 된다.

8 개 스레드를 사용한다면 다음과 같이 실행하면 하나의 프로세스에 8 개의 코어를 할당할 수 있다.

$ mpirun -n 2 --report-bindings --map-by NUMA:PE=8 ./pi_openmpi.x 

[pbcm:408424] MCW rank 0 bound to socket 0[core 0[hwt 0]], socket 0[core 1[hwt 0]], socket 0[core 2[hwt 0]], socket 0[core 3[hwt 0]], socket 0[core 4[hwt 0]], socket 0[core 5[hwt 0]], socket 0[core 6[hwt 0]], socket 0[core 7[hwt 0]]: [B/B/B/B/B/B/B/B/./././.][./././././././././././.]

[pbcm:408424] MCW rank 1 bound to socket 1[core 12[hwt 0]], socket 1[core 13[hwt 0]], socket 1[core 14[hwt 0]], socket 1[core 15[hwt 0]], socket 1[core 16[hwt 0]], socket 1[core 17[hwt 0]], socket 1[core 18[hwt 0]], socket 1[core 19[hwt 0]]: [./././././././././././.][B/B/B/B/B/B/B/B/./././.]

 myrank =           0 :           1  ~    500000000

 myrank =           1 :   500000001  ~   1000000000

 numerical  pi =    3.14159265259024     

 analytical pi =    3.14159265358979     

  Error =   9.995542171736815E-010 

[B/B/B/B/B/B/B/B/./././.] 부분에서 알 수 있듯이 8개의 코어에 프로세스가 할당되는 것을 알 수 있다.


openmpi는 버전이 올라감에 따라 다양한 아키텍처에서 유연하게 사용할 수 있도록 자유도가 높아지는 경향을 보인다.

대신에 사용자 입장에서는 제대로 사용하기 위해서는 여러가지 고려할 것이 더 많아지고 있다.

이상 hybrid 성능이 안나와서 삽질한 이야기.

: