読者です 読者をやめる 読者になる 読者になる

GCC 4.9.3 のビルド

ソースのダウンロード

必要な GMP, MPC, MPFR もダウンロードし,シンボリックリンクをはる.(他の prerequisites も古い場合は大変)

% mkdir -p ~/.src
% cd ~/.src
% wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.3/gcc-4.9.3.tar.gz
% tar zxf gcc-4.9.3.tar.gz
% wget http://ftp.gnu.org/gnu/gmp/gmp-6.0.0a.tar.bz2
% tar jxf gmp-6.0.0a.tar.xz
% wget http://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz
% tar zxf mpc-1.0.3.tar.gz
% wget http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.2.tar.gz
% tar zxf mpfr-3.1.2.tar.gz
% cd gcc-4.9.3
% ln -s ../mpc-1.0.3 mpc
% ln -s ../gmp-6.0.0 gmp
% ln -s ../mpfr-3.1.2 mpfr

configure

% mkdir build
% cd build
% ../configure --prefix=$HOME/local/gcc-4.9.3 \
  --program-suffix=-4.9.3 \
  --enable-languages=c,c++,fortran \
  2>&1 | tee configure.log

詳細は ../configure --help 参照.

install

% make -j 8 2>&1 | tee make-all.log
% make -j 8 install 2>&1 | tee make-install.log

$LIBRARY_PATH が空を含むとカレントディレクトリが探索され失敗することがある (失敗した).その場合

% LIBRARY_PATH=$(echo $LIBRARY_PATH | sed -e 's/^:\+//' -e 's/:\+/:/g' -e 's/:\+$//')

とするとよい.

PATH

$HOME/.zshrc に以下を追加.

# gcc
GCC_ROOT=$HOME/local/gcc-4.9.3
PATH=$GCC_ROOT/bin:$PATH
LD_LIBRARY_PATH=$GCC_ROOT/lib:$GCC_ROOT/lib64:$LD_LIBRARY_PATH

ビルドした方を gcc として使用したい場合は以下のようにする.

% ln -s ~/local/gcc-4.9.3/bin/gcc-4.9.3 ~/bin/gcc
% PATH=$HOME/bin:$PATH

テスト

//! @file test.cpp
#include <iostream>
int main()
{
    std::cout << "__VERSION__ = " << __VERSION__ << std::endl;
    // binary literal and digit separators
    std::cout << "0b1'000'000 = " << 0b1'000'000 << std::endl;
    return 0;
}
% exec zsh
% gcc-4.9.3 --version
gcc (GCC) 4.9.3
Copyright (C) 2015 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.9.3 -std=c++1y test.cpp && ./a.out
__VERSION__ = 4.9.3
0b1'000'000 = 64

参考

Debian: Slurm Workload Manager の導入

序論

SLURM (Simple Linux Utility for Resource Management) は計算資源管理ソフトの一つ. ローカルホストで計算を複数流すために導入した.

方法

aptitude でインストール

% lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie
% su
# aptitude install slurm-wlm

依存する munge (認証サービス) も同時に入る.

munge の設定

鍵生成

# /usr/sbin/create-munge-key
Generating a pseudo-random key using /dev/urandom completed.

他の鍵生成法は InstallationGuide 参照.

パーミッションの変更

# chmod 700 /etc/munge/
# chmod 711 /var/lib/munge/
# chmod 700 /var/log/munge/
# chmod 755 /var/run/munge/
# chmod 400 /etc/munge/munge.key

起動

# /etc/init.d/munge start
[ ok ] Starting munge (via systemctl): munge.service.

テスト

# munge -n | unmunge
STATUS:           Success (0)
ENCODE_HOST:      LOCALHOST (127.0.1.1)
ENCODE_TIME:      2015-05-30 13:12:57 +0900 (1432959177)
DECODE_TIME:      2015-05-30 13:12:57 +0900 (1432959177)
TTL:              300
CIPHER:           aes128 (4)
MAC:              sha1 (3)
ZIP:              none (0)
UID:              root (0)
GID:              root (0)
LENGTH:           0

# remunge; echo $?
2015-05-30 13:13:40 Spawning 1 thread for encoding
2015-05-30 13:13:40 Processing credentials for 1 second
2015-05-30 13:13:41 Processed 14268 credentials in 1.000s (14264 creds/sec)
0

SLURM

設定

/usr/share/doc/slurm-wlm/README.Debian を参考に /usr/share/doc/slurmctld/slurm-wlm-configurator.html を開いて設定し, /etc/slurm-llnl/slurm.conf を作成する. または /usr/share/doc/slurm-client/examples/slurm.conf.simple.gz をコピーして編集する.

/usr/share/doc/slurmctld/slurm-wlm-configurator.html/usr/share/doc/slurm-client/examples/slurm.conf.simple.gz では項目に差異が見られる.今回は後者をもとに /etc/slurm-llnl/slurm.conf を作成した.

Control Machines

ControlMachine
ホスト名 ($HOST) に設定

Compute Machines

NodeName
localhost に設定
CPUs
他の作業ができるよう $(nprocs) - 2 = 6 に設定

Resource Selection

SelectType
1 ノードに複数のジョブを流すために Cons_res を選択

起動

# /etc/init.d/slurmd start
[ ok ] Starting slurmd (via systemctl): slurmd.service.
# /etc/init.d/slurmctld start
[ ok ] Starting slurmctld (via systemctl): slurmctld.service.
# sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      1   idle localhost

テスト

test.sh を作成し投入:

#!/bin/sh
#SBATCH -J test         # job name
#SBATCH -o test-%j.dat  # standard output
#SBATCH -e test-%j.err  # standard error
#SBATCH -n 1            # number of tasks

echo ${SLURM_JOB_NAME}
echo ${SLURM_JOB_ID} >&2
% sbatch test.sh
% cat test-2.dat
test
% cat test-2.err
2

参考

Boost.PropertyTree: XML 出力

序論

Boost.PropertyTree木構造のライブラリーで,XML, JSON, INI, INFO のパーサが提供されている.

Boost.PorpertyTree を利用して W3Schools の XML Attributes

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

を出力する.

方法

#include <string>
#include <locale>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

int main()
{
    // create an empty property tree
    boost::property_tree::ptree pt;

    // create the root element
    boost::property_tree::ptree& root = pt.put("messages", "");

    // add child elements
    // absolute path
    pt.put("messages.note.<xmlattr>.id", "501");
    pt.put("messages.note.to", "Tove");
    pt.put("messages.note.from", "Jani");
    pt.put("messages.note.heading", "Reminder");
    pt.put("messages.note.body", "Don't forget me this weekend!");
    // relative path
    boost::property_tree::ptree& child = root.add("note", "");
    child.put("<xmlattr>.id", "502");
    child.put("to", "Jani");
    child.put("from", "Tove");
    child.put("heading", "Re: Reminder");
    child.put("body", "I will not");

    // output
    boost::property_tree::write_xml("messages.xml", pt, std::locale(),
        boost::property_tree::xml_writer_make_settings<std::string>(' ', 2));

    return 0;
}

出力:

<?xml version="1.0" encoding="utf-8"?>
<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don&apos;t forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

要素の追加

要素を追加するには putadd を使う.引数はパスと値.指定した値がすでにある場合 put は上書きするが, add は別のノードを追加する (How to Access Data in a Property Tree - Two Ways of Putting Data).

<xmlattr> で属性,<xmlcomment> でコメント,<xmltext> でテキストが追加できる (How to Populate a Property Tree - XML Parser).

boost::property_tree::write_xml

第1引数は std::basic_ostreamstd::string (ファイル名).property_tree より後の引数は省略可能.詳細は boost/property_tree/xml_parser.hpp - 1.58.0 参照.

boost::property_tree::xml_writer_make_settings

xml_writer_make_settingsxml_writer_settings を生成する関数. xml_writer_make_settings の引数はインデント文字,インデント幅,XML文字コード; デフォルトは ␣, 0, utf-8 (boost/property_tree/detail/xml_parser_writer_settings.hpp - 1.58.0).std::string と型指定しないとエラーになる.

write_xml の呼び出しでは省略可だが,設定しないとインデント・改行なしの XML が出力される:

<?xml version="1.0" encoding="utf-8"?>
<messages><note id="501"><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don&apos;t forget me this weekend!</body></note><note id="502"><to>Jani</to><from>Tove</from><heading>Re: Reminder</heading><body>I will not</body></note></messages>

ルート要素

複数のルート要素を追加しても Boost.PropertyTree は何も言わないので,自己責任で管理すること.

参考

Boost

XML

gnulot: SVG で出力

#!/usr/bin/gnuplot
set encoding utf8
set terminal svg size 480, 480 \
    enhanced \
    fsize 12 \
    name 'sin_x'
set size square
set xrange [-2*pi:2*pi]
set yrange [-1:1]
set xtics ('-2π' -2*pi, '-π' -pi, 0, 'π' pi, '2π' 2*pi)
set ytics 0.5
set xlabel '{/:Italic x}'
set ylabel '{/:Italic y}'
set output 'sin.svg'
plot sin(x) title '関数 sin {/:Italic x}'


出力 (埋め込み):

sin_x Produced by GNUPLOT 5.0 patchlevel 0 -1 -0.5 0 0.5 1 -2π 0 π y x 関数 sin {/:Italic x} 関数 sin x

参考

gnuplot

SVG

C, C++: 定義済みマクロの確認法

% CC  -dM -E -x c   /dev/null
% CXX -dM -E -x c++ /dev/null

CC=gcc, icc, clang; CXX=g++, icpc, clang++

  • -dM: マクロの定義を出力
  • -E: 出力を stdout に送る
  • -x <lang> <file>: <file><lang> とみなす

参考

C/C++ tip: How to list compiler predefined macros | Nadeau Software

OpenBLAS 0.2.13 のビルド

コンパイラの確認

% gcc --version
gcc (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 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.

Intel や PGI コンパイラでは駄目らしい (https://github.com/xianyi/OpenBLAS/blob/develop/Makefile.rule line 21).

CPUの確認

% grep 'model name' /proc/cpuinfo | head -n 1
model name      : Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz

Ivy Bridge だが,ビルドの際は Sandy Bridge を指定する (後述).

ソースのダウンロード

OpenBLAS : An optimized BLAS library から tarball をダウンロードし,解凍する.

% cd /tmp
% wget http://github.com/xianyi/OpenBLAS/tarball/v0.2.13
% tar zxf v0.2.13
% cd xianyi-OpenBLAS-aceee4e

または xianyi/OpenBLAS · GitHub から clone する.

% cd /tmp
% git clone git://github.com/xianyi/OpenBLAS
% cd OpenBLAS

ビルド

% make TARGET=SANDYBRIDGE BINARY=64 USE_OPENMP=1 INTERFACE64=1 \
  2>&1 | tee make-all.log
% su
# make install PREFIX=/usr/local/openblas-0.2.13_gcc-4.7.2 \
  2>&1 | tee make-install.log
  • make の際の変数は上記のように指定するか ./Makefile.rule の対応する変数を編集する
  • コンパイラ等の設定は上記にあるので参照すること
  • TARGET の一覧は ./TargetList.txt にある (何もしなくても自動で検出してくれるらしい)

環境変数の設定

$HOME/.zshrc に以下を追加する.

# OpenBLAS 0.2.13
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/openblas-0.2.13_gcc-4.7.2/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openblas-0.2.13_gcc-4.7.2/lib
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/openblas-0.2.13_gcc-4.7.2/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/openblas-0.2.13_gcc-4.7.2/include

テスト

以下に示す test_cblas.c を作成する.

//! @file test_cblas.c
#include <stdio.h>
#include <cblas.h>
#define M 3
#define N 3
#define K 2

//! cblas_ddot
void Level1()
{
    printf("%s: %s\n", __func__, "cblas_ddot");

    double x[N] = {1.0, 1.0, 1.0};
    double y[N] = {1.0, 2.0, 3.0};

    // x^T y
    double dot_product = cblas_ddot(N, x, 1, y, 1);

    printf("%.1f\n", dot_product);
}

//! cblas_dgemv
void Level2()
{
    printf("%s: %s\n", __func__, "cblas_dgemv");

    double A[M*K] = {1.0, 2.0,
                     3.0, 4.0,
                     5.0, 6.0};      // M-by-K matrix
    double x[K]   = {1.0, 1.0};
    double y[M]   = {0.0, 0.0, 0.0};

    CBLAS_ORDER     order = CblasRowMajor; // row major
    CBLAS_TRANSPOSE trans = CblasNoTrans;  // not transposed
    int    lda   = K;   // number of rows of A (row major)
    double alpha = 1.0; // coefficient of A x
    double beta  = 0.0; // coefficient of y

    // y = alpha A x + beta y
    cblas_dgemv(order, trans, M, K, alpha, A, lda, x, 1, beta, y, 1);

    for (int i = 0; i < M; i++) printf("%.1f\t", y[i]);
    printf("\n");
}

//! cblas_dgemm
void Level3()
{
    printf("%s: %s\n", __func__, "cblas_dgemm");

    double A[M*K] = {1.0, 2.0,
                     3.0, 4.0,
                     5.0, 6.0};      // M-by-K matrix
    double B[K*N] = {1.0, 2.0, 3.0,
                     4.0, 5.0, 6.0}; // K-by-N matrix
    double C[M*N] = {0.0, 0.0, 0.0,
                     0.0, 0.0, 0.0,
                     0.0, 0.0, 0.0}; // M-by-N matrix

    CBLAS_ORDER     Order  = CblasRowMajor; // row major
    CBLAS_TRANSPOSE TransA = CblasNoTrans;  // not transposed
    CBLAS_TRANSPOSE TransB = CblasNoTrans;  // not transposed
    int    lda   = K;   // number of rows of A (row major)
    int    ldb   = N;   // number of rows of B (row major)
    int    ldc   = N;   // number of rows of C (row major)
    double alpha = 1.0; // coefficient of A B
    double beta  = 0.0; // coefficient of C

    // C = alpha A B + beta C
    cblas_dgemm(Order, TransA, TransB, M, N, K,
            alpha, A, lda, B, ldb, beta, C, ldc);

    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++) printf("%4.1f\t", C[i*N+j]);
        printf("\n");
    }
}

int main()
{
    Level1();
    Level2();
    Level3();
    return 0;
}
% gcc -std=c99 -I/usr/local/openblas-0.2.13_gcc-4.7.2/include \
  -L/usr/local/openblas-0.2.13_gcc-4.7.2/lib \
  -lopenblas -lpthread -lgfortran test_cblas.c
% ./a.out
Level1: cblas_ddot
6.0
Level2: cblas_dgemv
3.0     7.0     11.0
Level3: cblas_dgemm
 9.0    12.0    15.0
19.0    26.0    33.0
29.0    40.0    51.0

なお,CBLAS_ORDERCBLAS_TRANSPOSEopenblas/include/cblas.h に以下のように定義されている.

typedef enum CBLAS_ORDER     {CblasRowMajor=101, CblasColMajor=102} CBLAS_ORDER;
typedef enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113, CblasConjNoTrans=114} CBLAS_TRANSPOSE;

環境変数が通っていれば -I および -L オプションは不要.

BLAS Level 1

cblas_ddot が計算するのは $$ \text{dot} \gets {\it \boldsymbol{x}} \cdot {\it \boldsymbol{y}} $$ である (double precision dot product).${\it \boldsymbol{x}} = [1, 1, 1] ^ \intercal, {\it \boldsymbol{y}} = [1, 2, 3] ^ \intercal$ なので $$ {\it \boldsymbol{x}} \cdot {\it \boldsymbol{y}} = 6 $$


BLAS Level 2

cblas_dgemv が計算するのは $$ {\it \boldsymbol{y}} \gets \alpha {\it \boldsymbol{A}} {\it \boldsymbol{x}} + \beta {\it \boldsymbol{y}} $$ である (double precision general matrix-vector product). $$ {\it \boldsymbol{A}} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} , \; {\it \boldsymbol{x}} = \begin{bmatrix} 1 \\ 1 \end{bmatrix} , \; {\it \boldsymbol{y}} = \boldsymbol{0} ;\\ \alpha = 1, \; \beta = 0 $$ なので,要するに ${\it \boldsymbol{y}} ={\it \boldsymbol{Ax}}$ である.答えは $$ {\it \boldsymbol{y}} = \begin{bmatrix} 3, & 7, & 11 \end{bmatrix} ^ \intercal $$


BLAS Level 3

cblas_dgemm が計算するのは $$ {\it \boldsymbol{C}} \gets \alpha {\it \boldsymbol{A}} {\it \boldsymbol{B}} + \beta {\it \boldsymbol{C}} $$ である (double precision general matrix-matrix product). $$ {\it \boldsymbol{A}} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} , \; {\it \boldsymbol{B}} = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} , \; {\it \boldsymbol{C}} = \boldsymbol{O} ;\\ \alpha = 1, \; \beta = 0 $$ なので,要するに ${\it \boldsymbol{C}} ={\it \boldsymbol{AB}}$ である.答えはもちろん $$ {\it \boldsymbol{C}} = \left[ \begin{array}{rrr} 9 & 12 & 15 \\ 19 & 26 & 33 \\ 29 & 40 & 51 \end{array} \right] $$

参考

極座標系の単位ベクトル

Cartesian は $\begin{bmatrix} x, y, z \end{bmatrix} ^\intercal$, 単位ベクトルは $\mathbf{e}$.

球座標系

$$ \begin{align} \begin{bmatrix} x \\ y \\ z \end{bmatrix} &= r \begin{bmatrix} \sin \theta \cos \phi \\ \sin \theta \sin \phi \\ \cos \theta \end{bmatrix} \\ \begin{bmatrix} r \\ \theta \\ \phi \end{bmatrix} &= \begin{bmatrix} \sqrt{x^2 + y^2 + z^2} \\ \cos^{-1} z/r \\ \tan^{-1} y/x \end{bmatrix} \end{align} $$

$$ \begin{bmatrix} \mathbf{e}_r \\ \mathbf{e}_\theta \\ \mathbf{e}_\phi \end{bmatrix} =% \begin{bmatrix} \sin \theta \cos \phi & \sin \theta \sin \phi & \hphantom{-} \cos \theta \\ \cos \theta \cos \phi & \cos \theta \sin \phi & - \sin \theta \\ - \sin \phi & \cos \phi & 0 \end{bmatrix} \begin{bmatrix} \mathbf{e}_x \\ \mathbf{e}_y \\ \mathbf{e}_z \end{bmatrix} $$

$$ \begin{bmatrix} \mathbf{e}_x \\ \mathbf{e}_y \\ \mathbf{e}_z \end{bmatrix} =% \begin{bmatrix} % \sin \theta \cos \phi & \cos \theta \cos \phi & - \sin \phi \\ \sin \theta \sin \phi & \cos \theta \sin \phi & \hphantom{-} \cos \phi \\ \cos \theta & - \sin \theta & 0 \end{bmatrix} \begin{bmatrix} \mathbf{e}_r \\ \mathbf{e}_\theta \\ \mathbf{e}_\phi \end{bmatrix} $$

円柱座標系

$$ \begin{align} \begin{bmatrix} x \\ y \\ z \end{bmatrix} &= \begin{bmatrix} \rho \cos \theta \\ \rho \sin \theta \\ z \end{bmatrix} \\ \begin{bmatrix} \rho \\ \theta \\ \phi \end{bmatrix} &= \begin{bmatrix} \sqrt{x^2 + y^2} \\ \tan^{-1} y/x \\ z \end{bmatrix} \end{align} $$

$$ \begin{bmatrix} \mathbf{e}_\rho \\ \mathbf{e}_\theta \\ \mathbf{e}_z \end{bmatrix} =% \begin{bmatrix} \hphantom{-} \cos \theta & \sin \theta & 0 \\ - \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \mathbf{e}_x \\ \mathbf{e}_y \\ \mathbf{e}_z \end{bmatrix} $$

$$ \begin{bmatrix} \mathbf{e}_x \\ \mathbf{e}_y \\ \mathbf{e}_z \end{bmatrix} =% \begin{bmatrix} \cos \theta & - \sin \theta & 0 \\ \sin \theta & \hphantom{-} \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \mathbf{e}_\rho \\ \mathbf{e}_\theta \\ \mathbf{e}_z \end{bmatrix} $$

補足

ノルムを変えないので変換行列は直行行列である.

Boost のバージョンの確認法

#include <iostream>
#include <boost/version.hpp>

int main()
{
    int major = BOOST_VERSION / 100000;
    int minor = BOOST_VERSION / 100 % 1000;
    int patch = BOOST_VERSION % 100;
    std::cout << "boost version " << major << "." << minor << "." << patch
        << " or " << BOOST_LIB_VERSION << std::endl;
    return 0;
}

出力

boost version 1.57.0 or 1_57

参考

boost/version.hpp

Boost 1.57.0 のビルド

tarball のダウンロード

sourceforge から boost_1_57_0.tar.gz をダウンロードし,解凍する.

% wget http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.tar.gz
% tar xvzf boost_1_57_0.tar.gz
% cd boost_1_57_0

b2 及び bjam を生成する.

% ./bootstrap.sh

`Recommended!' なのでビルド用のディレクトリを作る.

% su
# mkdir /tmp/build_boost

ビルドの設定

$HOME/user-config.jam

設定ファイル user-config.jam$HOME (か $BOOST_BUILD_PATH) に置く (Boost.Build User Manual > 3. Overview > Configuration).

# cp ./tools/build/example/user-config.jam $HOME

コンパイラの設定

Intel コンパイラを利用する場合

% icpc -v      
icpc version 14.0.1 (gcc version 4.7.0 compatibility)

$HOME/user-config.jam に以下を追加する (詳細は Builtin tools#Intel C++ 参照).

# --------------------------
# intel-linux configuration.
# --------------------------
using intel-linux : 14.0.1 : icpc : <cxxflags>-std=c++11 ;

GCC を利用する場合

% g++ --version
g++ (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 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.

$HOME/user-config.jam の 44 行目を編集する (詳細は Builtin tools#GNU C++ 参照).

# Configure specific gcc version, giving alternative name to use.
using gcc : 4.7.2 : g++ : <cxxflags>-std=c++11 ;

Boost.MPI を利用する場合

$HOME/user-config.jam に以下を追加する (Boost.MPI > Getting started#Configure and Build).

# ------------------
# mpi configuration.
# ------------------
using mpi : mpicxx ;

使用するノードが全て同じ (homogeneous machines) 場合

BOOST_MPI_HOMOGENEOUS マクロを定義する.

% grep -nr '#define BOOST_MPI_HOMOGENEOUS' .
./boost/mpi/config.hpp:26://#define BOOST_MPI_HOMOGENEOUS
--- a/boost/mpi/config.hpp
+++ b/boost/mpi/config.hpp
@@ -26 +26 @@
-//#define BOOST_MPI_HOMOGENEOUS
+#define BOOST_MPI_HOMOGENEOUS

ビルド

詳細は ./b2 --help 参照.

# ./b2 -j4 --prefix=/usr/local/boost-1.57.0_intel-14.0.1_openmpi-1.8.4 \
  --build-dir=/tmp/build_boost \
  toolset=intel-linux \
  install 2>&1 | tee b2-install.log

または

# ./b2 -j4 --prefix=/usr/local/boost-1.57.0_gcc-4.7.2_openmpi-1.8.4 \
  --build-dir=/tmp/build_boost \
  toolset=gcc \
  install 2>&1 | tee b2-install.log

Boost.MPI を利用しない場合は --without-mpi を追加する (デフォルトでは全ライブラリがビルドされる).

パスの設定

$HOME/.zshrcに以下を追加する.

# Boost 1.57.0
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/boost-1.57.0_intel-14.0.1_openmpi-1.8.4/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/boost-1.57.0_intel-14.0.1_openmpi-1.8.4/lib
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/boost-1.57.0_intel-14.0.1_openmpi-1.8.4/include

参考

Open MPI 1.8.4 のインストール

tarballのダウンロード

ホームページ から openmpi-1.8.4.tar.gz をダウンロードし,解凍する.

% cd /tmp
% wget http://www.open-mpi.org/software/ompi/v1.8/downloads/openmpi-1.8.4.tar.gz
% tar xzf openmpi-1.8.4.tar.gz
% cd openmpi-1.8.4

configure

Intel コンパイラを利用する場合

% icc -v
icc version 14.0.1 (gcc version 4.7.0 compatibility)
% ./configure --prefix=/usr/local/openmpi-1.8.4_intel-14.0.1 \
  CC=icc CXX=icpc F77=ifort FC=ifort \
  2>&1 | tee configure_intel.log

GCC を利用する場合

% gcc --version
gcc (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 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.
% ./configure --prefix=/usr/local/openmpi-1.8.4_gcc-4.7.2 \
  CC=gcc CXX=g++ F77=gfortran FC=gfortran \
  2>&1 | tee configure_gcc.log

--prefix=PREFIX とすると PREFIX にインストールされる.root 権限がない場合等は例えば $HOME/local 以下を指定する. 詳細は ./configure --help 参照.

インストール

% make -j 4 2>&1 | tee make-all.log
% su
# make -j 4 install 2>&1 | tee make-install.log

パスの設定

$HOME/.zshrcに以下を追加する.

# Open MPI 1.8.4
MPIROOT=/usr/local/openmpi-1.8.4_intel-14.0.1
# or MPIROOT=/usr/local/openmpi-1.8.4_gcc-4.7.2
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPIROOT/lib
export MANPATH=$MANPATH:$MPIROOT/share/man

パスが通っていなくても mpirun --prefix=$MPIROOT (Open MPI FAQ) で実行可能.

しかしながら Open MPI 以外の mpirun にパスが通っている場合,

export PATH=$PATH:$MPIROOT/bin

とした時の mpirun が失敗することに注意.

$HOME/.rhosts$HOME/hostfile の作成

$HOME/.rhosts

$HOME/.rhosts はジョブを投入するマシンとユーザを指定するファイルで, rsh を利用して計算を流す場合各計算ノードの $HOME に必要となる. 書式は <hostname> <user> (詳細は Open MPI FAQ).

% echo "$(hostname) $USER" > $HOME/.rhosts

rsh しない場合は

% echo 'localhost' > $HOME/.rhosts

または

% echo 'localhost.localdomain' > $HOME/.rhosts

$HOME/hostfile

$HOME/hostfile は ホスト名とコア数を列挙したファイルで,書式は <hostname> slots=<number of cores> (slots が指定されていない場合はシングルコア, 詳細は Open MPI FAQ).

$HOME/.rhostslocalhost の場合は

% echo "localhost slots=$(grep processor /proc/cpuinfo | wc -l)" > $HOME/hostfile

2015-03-04 追記 nproc を利用すると以下のようになる:

% echo "localhost slots=$(nproc)" > $HOME/hostfile

ユーザ全体に同じホストを利用させたい場合は $MPIROOT/etc/openmpi-default-hostfile を編集する.

mpirun --hostfile <hostfile>mpirun --host <host> で実行時に指定することも可能 (Open MPI FAQ: hostfile, host).

また, TORQUESLURM を利用する場合は不要 (Open MPI FAQ).

テスト

% exec zsh
% cd /tmp/openmpi-1.8.4/examples
% make
% mpirun -np 4 ./hello_c
Hello, world, I am 2 of 4, (Open MPI v1.8.4, package: Open MPI USER@HOST Distribution, ident: 1.8.4, repo rev: v1.8.3-330-g0344f04, Dec 19, 2014, 128)
Hello, world, I am 0 of 4, (Open MPI v1.8.4, package: Open MPI USER@HOST Distribution, ident: 1.8.4, repo rev: v1.8.3-330-g0344f04, Dec 19, 2014, 128)
Hello, world, I am 1 of 4, (Open MPI v1.8.4, package: Open MPI USER@HOST Distribution, ident: 1.8.4, repo rev: v1.8.3-330-g0344f04, Dec 19, 2014, 128)
Hello, world, I am 3 of 4, (Open MPI v1.8.4, package: Open MPI USER@HOST Distribution, ident: 1.8.4, repo rev: v1.8.3-330-g0344f04, Dec 19, 2014, 128)

参考

Open MPI: Open Source High Performance Computing