6. クラスター計算機で udocker を利用する: プログラムの実行


udocker でプログラムを実行

基本コマンド編-3でudockerの利用方法がわかったので、udockerを利用してプログラムを実行してみる

gcc 7.3 を利用する

c++の新機能をサポートしているコンパイラーとそうでないコンパイラーの動きの違いをみてみよう

ここでは、C++17で利用可能になった十六進浮動小数点数リテラルを試してみる

ホストのg++を確認

$ g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 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.

g++の4.8.3は十六進浮動小数点数リテラルをサポートしていない
この事を利用してホスト上のg++とudocker上のg++の動作が比較できる

udockerでgccの7.3のコンテナを作成する

$ ./udocker pull gcc:7.3
Downloading layer: sha256:3e731ddb7fc902c6fc10f00cd7f99f11d63914692bd8c2816a29e6d016353932
...
Downloading layer: sha256:3a69201118730762995a17ad62b653b3a0467e7eeaf77ffb893ba09d1c5b8529
$ ./udocker create --name=gcc_7_3 gcc:7.3
c0f4db7f-6d39-3a62-bb8b-197b57d7302e
$ ./udocker -q run gcc_7_3 g++ --version
g++ (GCC) 7.3.0
Copyright (C) 2017 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.

udockerでgcc 7.3のコンテナが作成された

  • gcc:7.3 を指定して GCCのVersion 7.3のイメージをdocker hubから取得
    • 途中の出力は省略
  • 先程取得したイメージから、gcc_7_3 という名前のコンテナを作成する
    • ちょっと時間がかかる
  • gcc_7_3のコンテナ上のg++のバージョンを確認

十六進浮動小数点数リテラルのサンプルをhexadecimal_floating_literals.cppとして保存しておく

#include <iostream>

int main()
{
  std::cout << 0xABCp-3f << '\n';
  double dbl_min = 0x1.0p-1'022; // 1 * 2^-1022 (double の正の正規化数の最小値)
  std::cout << dbl_min << '\t' << std::hexfloat << dbl_min << '\n';
  return 0;
}

ホスト上でコンパイルを実行してみる

$ g++ ./hexadecimal_floating_literals.cpp -o gpp_4.out
./hexadecimal_floating_literals.cpp:6:28: warning: missing terminating ' character [enabled by default]
   double dbl_min = 0x1.0p-1'022; // 1 * 2^-1022 (double の正の正規化数の最小値)
                            ^
./hexadecimal_floating_literals.cpp:6:3: error: missing terminating ' character
   double dbl_min = 0x1.0p-1'022; // 1 * 2^-1022 (double の正の正規化数の最小値)
   ^
./hexadecimal_floating_literals.cpp: In function 'int main()':
./hexadecimal_floating_literals.cpp:7:3: error: expected ',' or ';' before 'std'
   std::cout << dbl_min << '\t' << std::hexfloat << dbl_min << '\n';
   ^

サポートされていない形式なのでコンパイルできない

udockerを利用してgcc_7_3のコンテナを利用してコンパイルしてみる

$ ./udocker -q run -v ${PWD}:/work -w /work gcc_7_3 g++ hexadecimal_floating_literals.cpp -o gpp_73.out
$ ./gpp_73.out
343.5
2.22507e-308    2.22507e-308

コンパイルは成功し、コンパイル後のオブジェクトの実行も確認できた

  • udockerのオプションについて
    • -q: 実行時のバナー等の抑制
    • -v: 指定したホストのディレクトリをコンテナ上のディレクトリにマップ
      • ホストのカレントディレクトリをコンテナ上の/workにマップしている
    • -w: コンテナ上でのカレントディレクトリを指定
      • コンテナ上の/workでコンパイルを実行している

今日はこれまで