研究室の計算機サーバで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でソース取得します. あなたが実際に取得するバージョンを選びましょう.
ディレクトリ構成は下記のようにしています. 将来的に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ソースの取得
-
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
- ソース展開, ビルドに必要なものをインストールする
tar -xf gcc-14.3.0.tar.xz cd gcc-14.3.0 ./contrib/download_prerequisites
ビルド設定
下記コマンド実行前は, $HOME/src/gcc/gcc-14.3.0
にいるはず.
- ビルド専用ディレクトリの作成
mkdir ../build-gcc-14.3.0 && cd ../build-gcc-14.3.0
- ビルド設定:
$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
にいるはず.
- ビルド: 時間がかかるのでjオプションで並列化
nohup make -j$(nproc) > build.log 2>&1 &
- インストール
make install
- 中身の確認:
$HOME/local/gcc/14.3.0
ディレクトリがあり, そこにbin
,include
等のディレクトリがあればOK.
パスを通す
- シェルが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
- .bashrcを読み込んで設定を有効化
source $HOME/.bashrc
動作確認
- 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)
- 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を使うことにします.
本記事で誤りや疑問等ありましたら, コメント頂けると幸いです!
Discussion