🗳️

研究室の計算機サーバでC++23を使う: 既存環境に影響を与えない方法

に公開

本記事のモチベーション

著者(いち学生)の研究室の計算機サーバでは, デフォルトでg++コンパイラがGCC8.5, C++がC++17しか使えませんでした. 私としては, 関数型プログラミング的な表現が便利なのでC++23を使いたい.

サーバ上でC++23を使うこと自体は簡単でした. /opt/rh/gcc-toolset-13があったので, その中にあるC++23を使えばよいです. しかし, gcc-toolset-13では標準ライブラリが不足しており, 例えばstd::ranges::toなどが使えませんでした.

そこで, 計算機サーバにGCC14を入れることにしました. 本記事は, そのやり方と解説になります.

グローバルに設定すると他ユーザが困る可能性があるので, サーバの個人ディレクトリのみでGCC14を使い, C++23を使えるようにします. 他ユーザもC++23を使いたい場合は, そのユーザの個人ディレクトリで同様の作業を行えばOKです. 一人あたり約1.7GBの追加容量で利用可能です.

目次

前提条件

読者に求めること:

  • SSHでサーバに入れる
  • Linux系の基本的な知識があり, 基本的な操作ができる

著者の計算機サーバのユースケース:

  • ソースをいじるのはパラメータの書き換え(py使用)だけ.
  • あとはソースのコンパイルと実行だけ行う(開発はローカルで行う).

著者の環境

作業前の環境について, 重要と思われる情報のみ記載します.

マシン関係

// cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.10 (Green Obsidian)"
ID_LIKE="rhel centos fedora"

// cat /etc/redhat-release
Rocky Linux release 8.10 (Green Obsidian)

// uname -a
Linux aurora 4.18.0-553.22.1.el8_10.x86_64
#1 SMP Wed Sep 25 09:20:43 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Rocky Linuxは, "RHELと100%バグ互換性がある"オープンソースです. ここでは, RHELとほぼ同じと考えて差し支えありません.

C++関係

コンパイラにはGCCを使用します.

// which g++
/usr/bin/g++

// g++ --version
g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-26)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

GCC14のインストール

作業はすべて個人ディレクトリで行います. 基本的にroot権限は不要です.

ここでは, 次のサイトからGCC14.3.0をwgetでソース取得します. あなたが実際に取得するバージョンを選びましょう.

https://ftp.gnu.org/gnu/gcc/gcc-14.3.0/

ディレクトリ構成は下記のようにしています. 将来的にGCC15などを追加するために, バージョンごとにlocal内でディレクトリを分けています.

/home/{yourname}/
├── src/  # ビルド用作業ディレクトリ
│   └── gcc
│       ├── build-gcc-14.3.0  # GCC14.3.0のビルド先
│       ├── gcc-14.3.0        # GCC14.3.0ソース(展開後)
│       ├── gcc-14.3.0.tar.xz # GCC14.3.0ソース(展開前)
│       ├── build-gcc-15.1.0  # 将来の追加バージョン
│       ├── gcc-15.1.0
│       ├── gcc-15.1.0.tar.xz
│       └── …
└── local/  # ビルド済みインストール先ディレクトリ
    └── gcc/
        ├── 14.3.0/  # GCC14.3.0のビルド済みインストール先
        ├── 15.1.0/  # 将来の追加バージョン
        └── …

GCCソースの取得

  1. srcディレクトリの作成, ソース取得
    mkdir -p $HOME/src/gcc && cd $HOME/src/gcc
    wget https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz
    
  2. ソース展開, ビルドに必要なものをインストールする
    tar -xf gcc-14.3.0.tar.xz
    cd gcc-14.3.0
    ./contrib/download_prerequisites
    

ビルド設定

下記コマンド実行前は, $HOME/src/gcc/gcc-14.3.0にいるはず.

  1. ビルド専用ディレクトリの作成
    mkdir ../build-gcc-14.3.0 && cd ../build-gcc-14.3.0
    
  2. ビルド設定: $HOME/local/gcc/14.3.0に格納されるように設定している.
    ../gcc-14.3.0/configure --prefix=$HOME/local/gcc/14.3.0 \
       --enable-languages=c,c++ \
       --disable-multilib \
       --disable-nls \
       --enable-checking=release \
       --enable-lto \
       --enable-libstdcxx-backtrace \
       --with-system-zlib
    

ビルド設定オプションの説明:

オプション 説明
enable-languages=c,c++ C,C++のコンパイラだけをビルドする.
Fortranなどの多言語を無視してビルド時間とディスク容量を削減する.
disable-multilib 32bitライブラリのビルドを無効化(64bitのみビルド).
64bit環境なら32bitライブラリは不要.
disable-nls NSL(各言語対応)を無効化する.
エラーメッセージ等が常に英語で出力されるのでデバッグしやすい.
enable-checking=release ビルド時の内部チェックを無効にする.
開発はローカルで行うのでパフォーマンスを優先.
enable-lto LTO(リンク時最適化)を有効化.
パフォーマンス向上が可能.
enable-libstdcxx-backtrace backtrace情報サポートを有効化.
例外発生時にスタックトレースを得られる. ローカルでは上手くいったがサーバで上手くいかないとき用.
with-system-zlib システムにすでにあるzlib(圧縮/展開)を使用する.
ビルドが軽くなる.

ビルドとインストール

下記コマンド実行前は, $HOME/src/gcc/build-gcc-14.3.0にいるはず.

  1. ビルド: 時間がかかるのでjオプションで並列化
    nohup make -j$(nproc) > build.log 2>&1 &
    
  2. インストール
    make install
    
  3. 中身の確認: $HOME/local/gcc/14.3.0ディレクトリがあり, そこにbin,include等のディレクトリがあればOK.

パスを通す

  1. シェルがbashの場合, $HOME/.bashrcに下記を追記.
    export GCC_VER=14.3.0  # 切り替え可能
    export PATH=$HOME/local/gcc/$GCC_VER/bin:$PATH
    export LD_LIBRARY_PATH=$HOME/local/gcc/$GCC_VER/lib64:$LD_LIBRARY_PATH
    
  2. .bashrcを読み込んで設定を有効化
    source $HOME/.bashrc
    

動作確認

  1. g++のパスと情報を確認
    which g++
    // 下記のようになるはず (~は$HOMEのこと.)
    ~/local/gcc/14.3.0/bin/g++
    
    g++ -v
    // およそ下記のようになるはず
    Using built-in specs.
    COLLECT_GCC=g++
    COLLECT_LTO_WRAPPER=/home/{yourname}/local/gcc/14.3.0/libexec/gcc/x86_64-pc-linux-gnu/14.3.0/lto-wrapper
    Target: x86_64-pc-linux-gnu
    Configured with: ../gcc-14.3.0/configure --prefix=/home/{yourname}/local/gcc/14.3.0 --enable-languages=c,c++ --disable-multilib --enable-lto --enable-checking=release --with-system-zlib
    Thread model: posix
    Supported LTO compression algorithms: zlib zstd
    gcc version 14.3.0 (GCC)
    
  2. C++23の機能を含んだ下記コードをコンパイル・実行できれば完了✅️
    #include <ranges>
    #include <vector>
    #include <iostream>
    
    // 偶数を抽出して2倍し, vector<int>とするだけのコード.
    // std::ranges:toはC++23の機能.
    int main() {
        std::vector<int> data = {1, 2, 3, 4, 5, 6};
    
        auto result = data
            | std::views::filter([](int x) { return x % 2 == 0; })
            | std::views::transform([](int x) { return x * 2; })
            | std::ranges::to<std::vector<int>>();
    
        for (int x : result) std::cout << x << " ";  // 出力: 4 8 12
    }
    

おわりに

これにて, RHEL8計算機サーバで, 他ユーザへの影響なしでGCC14のC++23を使えます.
一人あたり約1.7GBの追加容量で利用可能なので, 複数人でも余裕です.

ちなみにHPCのC++23対応状況ですが, 例えば日本の「富岳」や2025年6月のTOP500で1位だった「El Capitan」はC++17までしかサポートしていないようです. ソースはこちら → 富岳(しかもC++17サブセット), El Capitan(使用するCray Compilerがgcc-toolset-13をサポート).
しかし, 2027年には富岳に変わる「Monaka」もリリース予定とのことですし, 私(学部4年)がスパコンを頻繁に使用する頃には対応しているだろう, と楽観視してC++23を使うことにします.

本記事で誤りや疑問等ありましたら, コメント頂けると幸いです!

GitHubで編集を提案

Discussion