개인 공부/리눅스

Centos 7, SPEC2017 설치

RyoTTa 2022. 5. 4. 17:14
반응형

환경

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 파일을 모아준다.

 

 

반응형