CentOS7.9@wsl2에 Intel oneAPI(intel compiler)를 설치&hello 프로그램을 실행한다.

[email protected]에 Intel oneAPI(intel compiler)를 설치&hello 프로그램을 실행한다.

2022-10-06 last update

16 minutes reading WSL CentOS WSL2 intelFortran mkl

[email protected]에 Intel oneAPI(intel compiler) 환경을 구축한다.



몇 가지 소개 에서처럼 Intel 컴파일러 및 라이브러리 인 Intel oneAPI를 무료로 사용할 수 있기 때문에 [email protected]에 설치해 보겠습니다.
컴파일러&MPI&MKL(수치 계산 라이브러리)를 넣고 싶기 때문에 BaseKit와 HPCkit를 인스톨 했습니다.

wsl2라면, gcc계도 들어 있지 않은 것 같고, 조금 넘어지기 때문에 기록합니다.
함께 확인에 사용한 아래의 hello 프로그램도 기재해 둡니다.
  • Fortran (with OpenMP, MPI)
  • C (with MPI)
  • C++ (with MPI)

  • (유익하면 LGTM 부탁드립니다)

    설치한 환경



    wsl2에서 CentOS7.9를 넣은 상태 (아래 참조)
    htps : // 코 m / 에오 / ms / 세 d8345 아 fb0 에c383 9

    GCC 준비



    gcc를 Online으로 설치한다.
    참조한 URL: htps //w w. 가드 ts-와다 y. 네 t/? p=806
    아래를 root로 실행.
    우선, 현재 상태와 설치할 수 있는 버전을 확인
    $ which gcc
    # 結果
    /usr/bin/which: no gcc in (:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:)
    
    $ yum info gcc
    # 結果(一部掲載)
    Available Packages
    Name        : gcc
    Version     : 4.8.5
    
    $ yum info gcc-c++
    #結果
    Name        : gcc-c++
    Version     : 4.8.5
    
    $ yum info gcc-gfortran
    # 結果
    Name        : gcc-gfortran
    Version     : 4.8.5
    

    이어서 설치
    $ yum install gcc
    $ yum install gcc-c++
    $ yum install gcc-gfortran
    # Dependencyも含めてインストール、Updateしてくれる。
    
    # gcc-c++で確認
    $ which g++
    #結果
    /usr/bin/g++
    
    $ g++ --version
    #結果
    g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
    Copyright (C) 2015 Free Software Foundation, Inc.
    

    intel OneAPI 설치.



    BaseKit과 HPCkit을 다운로드합니다. 이곳은 오프라인 버전으로 작업합니다.
    참고 사이트: htps : // 이 m / m ぃし t_ 네 / ms / 35bc4 8f2022903747
    을 바탕으로, 아래의 파일 2개를 다운로드.

    아래 두 가지 다운로드
    l_BaseKit_p_2021.1.0.2659_offline.sh
    l_HPCKit_p_2021.1.0.2684_offline.sh

    설치


    #まずはBaseKit
    sudo bash l_BaseKit_p_2021.1.0.2659_offline.sh
    #次にHPCKit
    sudo bash l_HPCKit_p_2021.1.0.2684_offline.sh
    

    각각 실행하면 아래와 같은 GUI 화면이 나옵니다.
    End User License Agreement에 동의하면,
    Accept & install로 진행합니다.
    특정 프로그램만 설치하고 싶은 경우는 Accept & configura installation을 적절히 체크를 해제해 주세요.



    설정



    설치 폴더인 setvars.sh를 실행하면 경로를 통해 줍니다.
    $ source /opt/intel/oneapi/setvars.sh
    $ which ifort
    #実行結果
    /opt/intel/oneapi/compiler/2021.1.1/linux/bin/intel64/ifort
    $ ifort --version
    #実行結果
    ifort (IFORT) 2021.1 Beta 20201112
    Copyright (C) 1985-2020 Intel Corporation.  All rights reserved.
    

    hello 프로그램을 실행하여 확인합니다.



    여기에서 일반 사용자로 실행합니다.
    우선, 로그인시에 패스가 통과하도록 설정한다.
    # ~/.bashrcに下記を加える。
    source  /opt/intel/oneapi/setvars.sh
    
    #bashrcの再読み込み
    $source ~/.bashrc
    #確認
    $ ifort --version
    $ which ifort
    #実行結果
    /opt/intel/oneapi/compiler/2021.1.1/linux/bin/intel64/ifort
    

    Fortran 계열



    보통 Fortran



    움직이는 프로그램은

    hello.f90
    program hello
      write(*,*) 'hello,world!'
    end program hello
    

    실행.
    $ ifort hello.f90 -o hello.exe
    $ ./hello.exe
    #実行結果
     hello, world!
    

    MPI Fortran



    참고 : htps : // 쿠 rc. Red d. cs. 이오 / 엔 / ㅁ st / p 로g 라민 g / M 피 푸 rt 란. HTML
    움직이는 프로그램은

    hello_mpi.f90
         PROGRAM hello_mpi
         include 'mpif.h'
    
         integer rank, size, ierror, tag
         character node*20
    
         call MPI_INIT(ierror)
         call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
         call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
         call MPI_Get_processor_name(node, node_len, ierror)
         write(*,*) 'hello, world! @ ',node, rank, 'of ', size
    
         call MPI_FINALIZE(ierror)
         END PROGRAM
    

    실행.
    $ mpiifort hello_mpi.f90 -o hello_mpi.exe
    #↓ 実行するとき"./"を省略しない
    $ mpirun -n 3 ./hello_mpi.exe
    #実行結果
     hello, world! @ node1                1 of            3
     hello, world! @ node1                2 of            3
     hello, world! @ node1                0 of            3
    

    openMP fortran



    hello_omp.f90
    program hello_omp
      !$ use omp_lib
      !$omp parallel
       write(*,*) "hello, world @",omp_get_thread_num(),"of",omp_get_num_threads()
      !$omp end parallel
    end program hello_omp
    

    실행해보십시오.
    $ ifort -qopenmp hello_omp.f90 -o hello_omp.exe
    #環境変数OMP_NUM_THREADSに並列化したいthreads数を指定
    $ export OMP_NUM_THREADS=4
    $ ./hello_omp.exe
    #実行結果
     hello, world @           0 of           4
     hello, world @           2 of           4
     hello, world @           3 of           4
     hello, world @           1 of           4
    
    #ちなみにoptionを"-openmp"にすると下記。wsl2だから?
    $ ifort -openmp hello_omp.f90 -o hello_omp.exe
    #実行結果
    ifort: command line error: option '-openmp' is not supported. Please use the replacement option '-qopenmp'
    

    C계



    일반 C



    hello.c
    #include <stdio.h>
    main( )
    {
      printf("hello, world\n");
    }
    
    $ icc hello.c -o hello.exe
    $ ./hello.exe
    #実行結果
    hello, world
    

    MPI C



    참고 : htps // m 피트리어 l. 코 m / 쓰리 아 ls / m 피 - ぉ - rld /

    hello_mpi.c
    #include <mpi.h>
    #include <stdio.h>
    
    int main(int argc, char** argv) {
        MPI_Init(NULL, NULL);
        int size;
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        int rank;
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        char node[MPI_MAX_PROCESSOR_NAME];
        int name_len;
        MPI_Get_processor_name(node, &name_len);
        printf("hello, world @ %s, %d of %d \n",node, rank, size);
        MPI_Finalize();
    }
    
    $ mpiicc hello_mpi.c -o hello_mpi.exe
    $ mpirun -n 5 ./hello_mpi.exe
    #実行結果
    hello, world @ node1, 1 of 5
    hello, world @ node1, 3 of 5
    hello, world @ node1, 0 of 5
    hello, world @ node1, 2 of 5
    hello, world @ node1, 4 of 5
    

    C++계



    보통



    hello.cpp
    #include <iostream>
    using namespace std;
    int main(){
      cout << "hello, world" << endl;
      return 0;
    }
    
    $ icpc hello.cpp -o hello.exe
    $ ./hello.exe
    #実行結果
    hello, world
    

    MPI C++



    프로그램은 hello_mpi.c와 동일한 것을 hello_mpi.cpp로 실행
    $ mpiicpc hello_mpi.cpp -o hello_mpi.exe
    $ mpirun -n 2 ./hello_mpi.exe
    #実行結果
    hello, world @ node1, 1 of 2
    hello, world @ node1, 0 of 2
    

    (보충) GCC에서 실행하는 경우



    gcc계에서 실행하는 경우는, 아래의 표에 따라 컴파일시의 커멘드를 읽어내면 실행 가능합니다.



    nomal
    MPI
    OpenMP


    인텔
    ifort
    mpiifort
    ifort -qopenmp

    gcc
    gfortran
    mpif90
    gfortran -fopenmp




    nomal
    MPI


    인텔
    icc
    mpiicc

    gcc
    cc/gcc
    mpicc




    nomal
    MPI


    인텔
    icpc
    mpiicpc

    gcc
    g++/cpp
    mpicxx


    (mpif90, mpicc은/opt/intel/oneapi/mpi/2021.1.1/bin에 링크되어 있습니다.
    intelOneAPI를 넣지 않은 경우 OpenMPI 등이 필요)