환경
Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz x2
CentOS Linux release 7.9.2009 (Core)
Linux 3.10.0-1160.el7.x86_64
gcc version 8.3.0 (GCC) (scl enable devtoolset-8)
소스코드
spec_cpu2017.iso를 연구실에서 구매후 설치를 준비한다. 벤치마크 소스와 컴파일, 수행, 검증을 위한 tool 프로그램들의 기본 바이너리 파일 및 소스가 존재하며 벤치마크 실행을 위한 규칙파일, 도큐먼트들이 존재한다.
$ mkdir tmnt
$ sudo mount -o loop spec_cpu2017.iso ./tmnt
$ ls tmnt
$ mkdir spec_cpu2017
$ cp -R ./tmnt/* spec_cpu2017/
$ sudo umount ./tmnt && rm -fr ./tmnt
$ sudo chown -R <username> spec_cpu2017
$ sudo chmod -R 755 spec_cpu2017
$ cd spec_cpu2017
spec_cpu2017 마운트 후 컴파일 하기위해 파일을 복사한다.
빌드
SPEC 2017 내부에는 벤치마크 빌드 위한 기본적인 tools의 바이너리 파일이 존재한다. install.sh는 하드웨어 및 운영체제와 일치하는 tools set을 선택한다.
$ ./install.sh
실행하면 일치하는 후보고 하나 이상 존재한다면 아래와 같이 메시지가 나타난다.
$ source shrc
위의 명령어로 PATH를 설정한다. C-shell compatible shell을 사용하면 source cshrc를 사용한다.
$ cd config
$ ls Example*
$ cp Example-gcc-linux-x86.cfg config.cfg
Config File을 선택해야한다. 이 Config File에는 최적화옵션 및 컴파일러 설정과 같은 정보가 포함되어있다. ls Example* 명령어를 통해 미리 정의된 예시 Config File을 복사해서 수정할 수 있다.
$ vim config.cfg
........................
1. EDIT 으로 표시된 라인을 찾아 환경에 맞게 수정한다.
2. PATH 를 확인하고 필요한 경우 수정한다. (ex, % define gcc_dir /usr)
........................
복사한 Config File에서 수정할 곳은 EDIT 으로 마킹되어있다. 이를 자신 환경에 맞게 수정한다.
$ runcpu --config=config --action=build 505.mcf_r
위의 명령어를 통해 505.mcf_r 을 빌드 시켜본다.
위 스크린샷과 같이 컴파일 에러가 발생한다. ~/benchmakr/spec2017/benchspec/CPU/505.mcf_r/build/build_base_mytest-m64.0000/make.out 에서 오류 목록을 확인할 수 있다.
gcc 에서 '-fno-tree-loop-vectorize' 옵션이 없어 에러가 발생했다.
https://www.spec.org/cpu2017/flags/gcc.html 에서는 위의 옵션이 비활성화되어 벡터라이저가 활성화 되었을때 일부 벤치마크에서 유의미한 올바른 답을 얻지 못했다고 한다.
$ vim config.cfg
....
-- 115 % define gcc_dir /usr
++ 115 % define gcc_dir /opt/rh/devtoolset-8/root/usr
....
config.cfg 파일에서 115번째 줄 define gcc_dir 를 /opt/rh/devtoolset-8/root/usr/ (devtoolset-8의 gcc 위치)으로 바꾸어주고 다시 runcpu를 통해 빌드 한다.
정상적으로 빌드가 되었으며 benchspec/CPU/505.mcf_r/build/build_base_mytest-m64.0000/ 아래에 mcf_r 파일이 생성되었다.
$ runcpu --config=config --action=build intrate
$ runcpu --config=config --action=build intspeed
$ runcpu --config=config --action=build fprate
$ runcpu --config=config --action=build fpspeed
SPEC CPU2017은 intrate, intspeed, fprate, fpspeed 4가지 벤치마크 Suite가 존재한다.
위의 명령어로 모든 벤치마크 바이너리 파일을 빌드해준다.
fprate 내의 510.parest_r 빌드시 오류가 발생한다. pointer 와 integer 를 비교해서 오류가 발생한다. config 파일에서 510.parest_r 을 위한 옵션을 추가한다.
$ vim config.cfg
....
++ 181 510.parest_r:
++ 182 PORTABILITY = -fpermissive
....
이후 정상적으로 빌드가 진행된다.
#!/bin/bash
if [ ${#} != 2 ]
then
echo "Error, Using [ProgramName] [2006 or 2017] [Extract Dir Name]"
exit 1
else
if [ ${1} == 2006 ] || [ ${1} == 2017 ]
then
echo "Extract SPEC $1 in ./$2"
dir_name=$2
version=$1
else
echo "Error, Using [ProgramName] [2006 or 2017] [Extract Dir Name]"
exit 1
fi
fi
benchlist_2006=( "400.perlbench" "401.bzip2" "403.gcc" "410.bwaves" "416.gamess" "429.mcf" "433.milc" \
"434.zeusmp" "435.gromacs" "436.cactusADM" "437.leslie3d" "444.namd" "445.gobmk" "447.dealII" \
"450.soplex" "453.povray" "454.calculix" "456.hmmer" "458.sjeng" "459.GemsFDTD" "462.libquantum" \
"464.h264ref" "465.tonto" "470.lbm" "471.omnetpp" "473.astar" "481.wrf" "482.sphinx3" "483.xalancbmk")
benchlist_2017=(
"500.perlbench_r" "502.gcc_r" "503.bwaves_r" "505.mcf_r" "507.cactuBSSN_r" "508.namd_r" "510.parest_r" \
"511.povray_r" "519.lbm_r" "520.omnetpp_r" "521.wrf_r" "523.xalancbmk_r" "525.x264_r" "526.blender_r" "527.cam4_r" "531.deepsjeng_r" \
"538.imagick_r" "541.leela_r" "544.nab_r" "548.exchange2_r" "549.fotonik3d_r" "554.roms_r" "557.xz_r" "600.perlbench_s" "602.gcc_s" \
"603.bwaves_s" "605.mcf_s" "607.cactuBSSN_s" "619.lbm_s" "620.omnetpp_s" "621.wrf_s" "623.xalancbmk_s" "625.x264_s" "627.cam4_s" \
"628.pop2_s" "631.deepsjeng_s" "638.imagick_s" "641.leela_s" "644.nab_s" "648.exchange2_s" "649.fotonik3d_s" "654.roms_s" "657.xz_s")
benchlist_id_2006=( "perlbench" "bzip2" "gcc" "bwaves" "gamess" "mcf" "milc" \
"zeusmp" "gromacs" "cactusADM" "leslie3d" "namd" "gobmk" "dealII" \
"soplex" "povray" "calculix" "hmmer" "sjeng" "GemsFDTD" "libquantum" \
"h264ref" "tonto" "lbm" "omnetpp" "astar" "wrf" "sphinx3" "xalancbmk")
benchlist_id_2017=(
"perlbench_r" "gcc_r" "bwaves_r" "mcf_r" "cactusBSSN_r" "namd_r" "parest_r" \
"povray_r" "lbm_r" "omnetpp_r" "wrf_r" "xalancbmk_r" "x264_r" "blender_r" "cam4_r" "deepsjeng_r" \
"imagick_r" "leela_r" "nab_r" "exchange2_r" "fotonik3d_r" "roms_r" "xz_r" "perlbench_s" "gcc_s" \
"bwaves_s" "mcf_s" "cactuBSSN_s" "lbm_s" "omnetpp_s" "wrf_s" "xalancbmk_s" "x264_s" "cam4_s" \
"pop2_s" "deepsjeng_s" "imagick_s" "leela_s" "nab_s" "exchange2_s" "fotonik3d_s" "roms_s" "xz_s")
binary_dir_2006="./spec_src/benchspec/CPU2006"
binary_dir_2017="./SPEC_2017/benchspec/CPU"
if [ $version == 2006 ]
then
benchlist=("${benchlist_2006[@]}")
benchlist_id=("${benchlist_id_2006[@]}")
binary_dir=$binary_dir_2006
else
benchlist=("${benchlist_2017[@]}")
benchlist_id=("${benchlist_id_2017[@]}")
binary_dir=$binary_dir_2017
fi
benchlist_size=${#benchlist[@]}
echo ${benchlist_size}
rm ./${dir_name} -rf
mkdir ./${dir_name}
mkdir ./${dir_name}/mix
for ((index=0 ; index < ${benchlist_size} ; index++));
do
echo ${benchlist_id[${index}]}
mkdir ./${dir_name}/${benchlist_id[${index}]}
cp ${binary_dir}/${benchlist[$index]}/exe/* ./${dir_name}/${benchlist_id[${index}]}/${benchlist_id[${index}]}
cp ${binary_dir}/${benchlist[$index]}/exe/* ./${dir_name}/mix/${benchlist_id[${index}]}
if [[ "${benchlist_id[${index}]}" =~ "_r" ]]; then
cp ${binary_dir}/${benchlist[$index]}/data/all/input/* ./${dir_name}/${benchlist_id[${index}]}/. -r
cp ${binary_dir}/${benchlist[$index]}/data/all/input/* ./${dir_name}/mix/. -r
cp ${binary_dir}/${benchlist[$index]}/data/refrate/input/* ./${dir_name}/${benchlist_id[${index}]}/. -r
cp ${binary_dir}/${benchlist[$index]}/data/refrate/input/* ./${dir_name}/mix/. -r
elif [[ "${benchlist_id[${index}]}" =~ "_r" ]]; then
temp=${benchlist[$index]:0:-2}
temp=${temp:1}
cp ${binary_dir}/5${temp}_r/data/all/input/* ./${dir_name}/${benchlist_id[${index}]}/. -r
cp ${binary_dir}/5${temp}_r/data/all/input/* ./${dir_name}/mix/. -r
cp ${binary_dir}/5${temp}_r/data/refspeed/input/* ./${dir_name}/${benchlist_id[${index}]}/. -r
cp ${binary_dir}/5${temp}_r/data/refspeed/input/* ./${dir_name}/mix/. -r
else
cp ${binary_dir}/${benchlist[$index]}/data/all/input/* ./${dir_name}/${benchlist_id[${index}]}/. -r
cp ${binary_dir}/${benchlist[$index]}/data/all/input/* ./${dir_name}/mix/. -r
cp ${binary_dir}/${benchlist[$index]}/data/ref/input/* ./${dir_name}/${benchlist_id[${index}]}/. -r
cp ${binary_dir}/${benchlist[$index]}/data/ref/input/* ./${dir_name}/mix/. -r
fi
#cp ${binary_dir}/${benchlist[$index]}/data/train/input/* ./${dir_name}/${benchlist_id[${index}]}/.
#cp ${binary_dir}/${benchlist[$index]}/data/test/input/* ./${dir_name}/${benchlist_id[${index}]}/.
done
빌드가 완성된 후 위의 스크립트를 실행하면 실행 바이너리 파일 및 Input, Output 파일을 모아준다.
'개인 공부 > 리눅스' 카테고리의 다른 글
CentOS7 gcc, g++ version update (0) | 2023.09.01 |
---|---|
Centos 7, SPEC2006 설치 - 2 (0) | 2022.01.13 |
Centos 7, /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found -2 (2) | 2022.01.11 |
Centos 7, /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (1) | 2021.05.27 |
Centos 7, gcc 버전 업데이트 (0) | 2021.03.16 |