スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 32bitで動かす(その2:MSMPI編)

MSMPIを使うプログラムのクロスコンパイルを試みた。
 ・クロスコンパイラが動く環境:Linux(今回は Ubuntu 64bit)
 ・クロスコンパイラによってコンパイルされたプログラムが動く環境:Windows 32bit(今回は Windows XP)

●関連記事

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 32bitで動かす(その1)
今回は(その1)の続編です。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その2:MSMPI編)
今回の記事の 64bitバージョンです。

●参考URL
http://www.symscape.com/configure-msmpi-for-mingw-w64

●インストールの(私の)方針

以下のディレクトリにインストールすることにする。

・MSMPI    /opt/ms-hpc-2008-sp2-32
       ← シンボリックリンク /opt/msmpi32

・gendef   /opt/mingw32-4.5.2/bin

●手順1:Windows側で「Microsoft HPC SDK SP2」をインストールし、Linux側にコピー
入手先:http://www.microsoft.com/downloads/en/details.aspx?familyid=13644DCD-4022-4BBC-B18F-1C9E9461D5BD&displaylang=en
  「sdk_x86.msi」を入手。

インストールは、入手した「sdk_x86.msi」を実行するだけ。

インストールされた以下のファイルが、Linux側で必要となる。
C:\Program Files\Microsoft HPC Pack 2008 SDK\*
C:\Windows\System32\msmpi.dll

これらのファイルは、私の環境では Linux側から以下の名前でアクセスできる。
/media/sda1/Program Files/Microsoft HPC Pack 2008 SDK
/media/sda1/WINDOWS/system32/msmpi.dll

これらを Linux側にコピーする。
まず「$HOME/ms-hpc-2008-sp2-32」にコピーし、若干の作業の後に「/opt/ms-hpc-2008-sp2-32」に移すことにする。
Linuxの端末で、以下を実行した。

cd
cp -r '/media/sda1/Program Files/Microsoft HPC Pack 2008 SDK' ms-hpc-2008-sp2-32
cd ms-hpc-2008-sp2-32/Lib/i386
cp '/media/sda1/WINDOWS/system32/msmpi.dll' .



●手順2(Linux側):gendefをコンパイル/インストール
入手先:http://sourceforge.net/apps/trac/mingw-w64/wiki/gendef
  「mingw-w64-gendef.tar.gz」(ソース)を入手した。

①「mingw-w64-gendef.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar zxf mingw-w64-gendef.tar.gz
cd gendef
mkdir build
cd build
#../configure -h
../configure --prefix=/opt/mingw32-4.5.2
make
sudo make install


「/opt/mingw32-4.5.2/bin」の下に、「gendef」がコピーされればインストール成功。

●手順3(Linux側):「libmsmpi.a」を作成

① gmp、mpfr、mpc が「/usr/local」にインストールされている場合は、端末で以下を実行。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


② 端末で以下を実行。

cd
cd ms-hpc-2008-sp2-32/Lib/i386
gendef -a msmpi.dll
i686-w64-mingw32-dlltool -k -d msmpi.def -l libmsmpi.a -D msmpi.dll


「libmsmpi.a」が生成されれば作業成功。

●手順4(Linux側):ファイル修正

① mpi.hを修正。

以下のページによると、mpi.hの修正が必要らしい。
http://www.symscape.com/configure-msmpi-for-mingw-w64

このページの手順に従い、以下のファイルを修正する。
$HOME/ms-hpc-2008-sp2-32/Include/mpi.h

エディタでファイルの先頭に行き、「#define MPI_INCLUDED」の下あたりに include文を1行追加した。

#ifndef MPI_INCLUDED
#define MPI_INCLUDED

#include <stdint.h>



●手順5(Linux側):MS-MPIを「/opt/ms-hpc-2008-sp2-32」に転送

① 端末で以下を実行。

cd
sudo mv ms-hpc-2008-sp2-32 /opt
cd /opt
sudo ln -s ms-hpc-2008-sp2-32 msmpi32



●後始末(Linux側)

① ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。

gendef



●テスト(その1)

① Linux側で「mpitest.cpp」を作成した。

#include <iostream>
#include "mpi.h"

int main(int argc, char* argv[])
{
int myrank;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
std::cout << "myrank = " << myrank << std::endl;
MPI_Finalize();
return 0;
}



② Linuxの端末で以下を実行して、クロスコンパイルした。
「-static」オプションを与えると、スタティックリンクされる。

i686-w64-mingw32-g++ -O3 -o mpitest32_d.exe mpitest.cpp \
-I/opt/msmpi32/Include -L/opt/msmpi32/Lib/i386 -lmsmpi
i686-w64-mingw32-g++ -O3 -o mpitest32_s.exe mpitest.cpp \
-I/opt/msmpi32/Include -L/opt/msmpi32/Lib/i386 -lmsmpi -static


「mpitest32_d.exe」と「mpitest32_s.exe」が生成されれば、コンパイル成功。

③ 生成された exeを、Windows(コマンドプロンプト)で動かしてみた。

>mpiexec -n 4 mpitest32_d.exe
myrank = 1
myrank = 2
myrank = 0
myrank = 3

>mpiexec -n 4 mpitest32_s.exe
myrank = 3
myrank = 0
myrank = 2
myrank = 1


いずれも動いた。
ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。
スタティックリンクの exeは、これらの dllがなくても動いた。

●テスト(その2):姫野ベンチマーク
入手先:http://accc.riken.jp/HPC/HimenoBMT/download2.html
  「cc_himenoBMTxp_mpi.lzh」(ソースコード、C + MPI、static allocate version)を入手した。

① もし Linuxに lhaが入っていなかったら、lhaをインストール。

sudo apt-get install lha-sjis



②「cc_himenoBMTxp_mpi.lzh」を Linuxのホームディレクトリに置き、端末で以下を実行。

cd
mkdir cc_himenoBMTxp_mpi
cd cc_himenoBMTxp_mpi
lha e ../cc_himenoBMTxp_mpi.lzh
mv himenobmtxps.c himenoBMTxps.c # lhaで解凍するとファイル名が小文字になってしまうので
chmod u+x paramset.sh



③ 引き続き以下を実行して、逐次処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 1
i686-w64-mingw32-gcc -O3 -o himeno32-1.exe himenoBMTxps.c \
-I/opt/msmpi32/Include -L/opt/msmpi32/Lib/i386 -lmsmpi


「himeno32-1.exe」が生成されればコンパイル成功。

④ 引き続き、2並列処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 2
i686-w64-mingw32-gcc -O3 -o himeno32-2.exe himenoBMTxps.c \
-I/opt/msmpi32/Include -L/opt/msmpi32/Lib/i386 -lmsmpi


「himeno32-2.exe」が生成されればコンパイル成功。

⑤ 引き続き、4並列処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 4
i686-w64-mingw32-gcc -O3 -o himeno32-4.exe himenoBMTxps.c \
-I/opt/msmpi32/Include -L/opt/msmpi32/Lib/i386 -lmsmpi


「himeno32-4.exe」が生成されればコンパイル成功。

⑥ 生成された exeを、デュアルコアのマシン(Windows XP Professional 32bit)で動かしてみた。

mpiexec -n 1 himeno32-1.exe
mpiexec -n 2 himeno32-2.exe
mpiexec -n 4 himeno32-4.exe



逐次処理の結果

>mpiexec -n 1 himeno32-1.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 129
imax = 64 jmax = 64 kmax =128
I-decomp = 1 J-decomp = 1 K-decomp =1
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1309.444535 time(s): 0.037728 3.288628e-003

Now, start the actual measurement process.
The loop will be excuted in 4770 times
This will take about one minute.
Wait for a while

cpu : 59.583110 sec.
Loop executed for 4770 times
Gosa : 1.548342e-006
MFLOPS measured : 1318.341892
Score based on Pentium III 600MHz : 15.914315



2並列の結果

>mpiexec -n 2 himeno32-2.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 67
imax = 64 jmax = 64 kmax =65
I-decomp = 1 J-decomp = 1 K-decomp =2
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1192.665928 time(s): 0.041422 3.301180e-003

Now, start the actual measurement process.
The loop will be excuted in 4345 times
This will take about one minute.
Wait for a while

cpu : 36.535770 sec.
Loop executed for 4345 times
Gosa : 2.916971e-006
MFLOPS measured : 1958.413311
Score based on Pentium III 600MHz : 23.640914



4並列の結果

>mpiexec -n 4 himeno32-4.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 35
imax = 64 jmax = 64 kmax =33
I-decomp = 1 J-decomp = 1 K-decomp =4
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1698.097469 time(s): 0.029093 3.293068e-003

Now, start the actual measurement process.
The loop will be excuted in 6187 times
This will take about one minute.
Wait for a while

cpu : 83.166784 sec.
Loop executed for 6187 times
Gosa : 1.877931e-007
MFLOPS measured : 1225.076055
Score based on Pentium III 600MHz : 14.788460


スポンサーサイト

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その2:MSMPI編)

MSMPIを使うプログラムのクロスコンパイルを試みた。
 ・クロスコンパイラが動く環境:Linux(今回は Ubuntu 64bit)
 ・クロスコンパイラによってコンパイルされたプログラムが動く環境:Windows 64bit(今回は Windows 7)

●記事修正
(2011/6/01) 「Microsoft HPC SDK SP2」をインストールしたとき、環境の違いにより、異なる版の「msmpi.dll」がインストールされる現象を確認しました。32ビット版らしき「msmpi.dll」がインストールされた場合、それを Linux側にコピーすると後の作業が失敗するため、「msmpi.dll」を Linux側にコピーする手順を大幅に書き換えました。

(2011/2/18) インストール先を「/usr/local」から「/opt」に変更し、インストールを再検証しました。

(2011/2/18) 姫野ベンチマークを再実行し、新しい結果を載せました。前回はタスクマネージャを立ち上げた状態で姫野ベンチを実行したため、おかしな結果になったみたいです。

●関連記事

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その1)
今回は(その1)の続編です。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 32bitで動かす(その2:MSMPI編)
今回の記事の 32bitバージョンです。

●参考URL
http://www.symscape.com/configure-msmpi-for-mingw-w64

●インストールの(私の)方針

以下のディレクトリにインストールすることにする。

・MSMPI    /opt/ms-hpc-2008-sp2
       ← シンボリックリンク /opt/msmpi

・gendef   /opt/mingw-4.5.2/bin

●手順1:Windows側で「Microsoft HPC SDK SP2」をインストールし、Linux側にコピー
入手先:http://www.microsoft.com/downloads/en/details.aspx?familyid=13644DCD-4022-4BBC-B18F-1C9E9461D5BD&displaylang=en
  「sdk_x64.msi」を入手。

インストールは、入手した「sdk_x64.msi」を実行するだけ。

①「C:\Program Files\Microsoft HPC Pack 2008 SDK\*」を Linux側にコピー

インストールされた以下のファイルが、Linux側で必要となる。
C:\Program Files\Microsoft HPC Pack 2008 SDK\*

このディレクトリは、私の環境では Linux側から以下の名前でアクセスできる。
/media/sda1/Program Files/Microsoft HPC Pack 2008 SDK

これをディレクトリごと Linux側にコピーする。
まず「$HOME/ms-hpc-2008-sp2」にコピーし、若干の作業の後に「/opt/ms-hpc-2008-sp2」に移すことにする。
Linuxの端末で、以下を実行した。

cd
cp -r '/media/sda1/Program Files/Microsoft HPC Pack 2008 SDK' ms-hpc-2008-sp2



②「sdk_x64.msi」から「msmpi64.dll」を抽出して Linux側にコピー

Windows上に「Microsoft HPC SDK SP2」をインストールすると、「C:\Windows\System32」の下に「msmpi.dll」がコピーされる。この DLLが 64ビット版であれば、そのまま Linux側にコピーしても良い。しかし Windows OSが 64ビット版であっても、環境により 32ビット版らしき「msmpi.dll」がコピーされる現象を確認した。これを Linux側にコピーすると、後の作業が失敗する。そこで、「sdk_x64.msi」から 64ビット版の「msmpi.dll」を抽出し、これを Linux側にコピーすることにした。

まず、msixコマンドを使用して、「sdk_x64.msi」に含まれる全ファイルを抽出する。
msixコマンドの入手法と使用法については、以下のページを参照。
http://www.atmarkit.co.jp/fwin2k/win2ktips/865msix/msix.html

Windowsのコマンドプロンプトで、以下を実行。

msix sdk_x64.msi /out sdk_x64 /ext


次に、抽出された「product.cab.cab」を WinRAR等のソフトを使って解凍する。
WinRARの入手先:http://www.diana.dti.ne.jp/~winrar/

解凍されたファイルの中に、以下があった。
・msmpi.dll (32ビット版らしい)
・msmpi64.dll (64ビット版らしい)

「msmpi64.dll」を、Linux側に「msmpi.dll」という名前でコピーする。

cd $HOME/ms-hpc-2008-sp2/Lib/amd64
cp '/media/sda1/msmpi64.dll' ./msmpi.dll



●手順2(Linux側):gendefをコンパイル/インストール
入手先:http://sourceforge.net/apps/trac/mingw-w64/wiki/gendef
  「mingw-w64-gendef.tar.gz」(ソース)を入手した。

①「mingw-w64-gendef.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar zxf mingw-w64-gendef.tar.gz
cd gendef
mkdir build
cd build
#../configure -h
../configure --prefix=/opt/mingw-4.5.2
make
sudo make install


「/opt/mingw-4.5.2/bin」の下に、「gendef」がコピーされればインストール成功。

●手順3(Linux側):「libmsmpi.a」を作成

① gmp、mpfr、mpc が「/usr/local」にインストールされている場合は、端末で以下を実行。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


② 端末で以下を実行。

cd
cd ms-hpc-2008-sp2/Lib/amd64
gendef msmpi.dll
x86_64-w64-mingw32-dlltool -d msmpi.def -l libmsmpi.a -D msmpi.dll


「libmsmpi.a」が生成されれば作業成功。

●手順4(Linux側):ファイル修正

① mpi.hを修正。

以下のページによると、mpi.hの修正が必要らしい。
http://www.symscape.com/configure-msmpi-for-mingw-w64

このページの手順に従い、以下のファイルを修正する。
$HOME/ms-hpc-2008-sp2/Include/mpi.h

エディタでファイルの先頭に行き、「#define MPI_INCLUDED」の下あたりに include文を1行追加した。

#ifndef MPI_INCLUDED
#define MPI_INCLUDED

#include <stdint.h>



●手順5(Linux側):MS-MPIを「/opt/ms-hpc-2008-sp2」に転送

① 端末で以下を実行。

cd
sudo mv ms-hpc-2008-sp2 /opt
cd /opt
sudo ln -s ms-hpc-2008-sp2 msmpi



●後始末(Linux側)

① ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。

gendef



●テスト(その1)

① Linux側で「mpitest.cpp」を作成した。

#include <iostream>
#include "mpi.h"

int main(int argc, char* argv[])
{
int myrank;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
std::cout << "myrank = " << myrank << std::endl;
MPI_Finalize();
return 0;
}



② Linuxの端末で以下を実行して、クロスコンパイルした。
「-static」オプションを与えると、スタティックリンクされる。

x86_64-w64-mingw32-g++ -O3 -o mpitest_d.exe mpitest.cpp \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi
x86_64-w64-mingw32-g++ -O3 -o mpitest_s.exe mpitest.cpp \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi -static


「mpitest_d.exe」と「mpitest_s.exe」が生成されれば、コンパイル成功。

③ 生成された exeを、Windows(コマンドプロンプト)で動かしてみた。

>mpiexec -n 4 mpitest_d.exe
myrank = 1
myrank = 0
myrank = 3
myrank = 2

>mpiexec -n 4 mpitest_s.exe
myrank = 0
myrank = 1
myrank = 2
myrank = 3


いずれも動いた。
ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。
スタティックリンクの exeは、これらの dllがなくても動いた。

●テスト(その2):姫野ベンチマーク
入手先:http://accc.riken.jp/HPC/HimenoBMT/download2.html
  「cc_himenoBMTxp_mpi.lzh」(ソースコード、C + MPI、static allocate version)を入手した。

① もし Linuxに lhaが入っていなかったら、lhaをインストール。

sudo apt-get install lha-sjis



②「cc_himenoBMTxp_mpi.lzh」を Linuxのホームディレクトリに置き、端末で以下を実行。

cd
mkdir cc_himenoBMTxp_mpi
cd cc_himenoBMTxp_mpi
lha e ../cc_himenoBMTxp_mpi.lzh
mv himenobmtxps.c himenoBMTxps.c # lhaで解凍するとファイル名が小文字になってしまうので
chmod u+x paramset.sh



③ 引き続き以下を実行して、逐次処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 1
x86_64-w64-mingw32-gcc -O3 -o himeno1.exe himenoBMTxps.c \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi


「himeno1.exe」が生成されればコンパイル成功。

④ 引き続き、2並列処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 2
x86_64-w64-mingw32-gcc -O3 -o himeno2.exe himenoBMTxps.c \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi


「himeno2.exe」が生成されればコンパイル成功。

⑤ 引き続き、4並列処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 4
x86_64-w64-mingw32-gcc -O3 -o himeno4.exe himenoBMTxps.c \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi


「himeno4.exe」が生成されればコンパイル成功。

⑥ 生成された exeを、WindowsノートPCに転送して動かしてみた。
 このノートPCの CPUは 2コアで、ハイパースレッディング=オンのため 4コアに見える。
 本当はハイパースレッディングをオフにしたいが、この機種は BIOSでオフに設定できなかった。

mpiexec -n 1 himeno1.exe
mpiexec -n 2 himeno2.exe
mpiexec -n 4 himeno4.exe



逐次処理の結果

>mpiexec -n 1 himeno1.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 129
imax = 64 jmax = 64 kmax =128
I-decomp = 1 J-decomp = 1 K-decomp =1
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1467.350528 time(s): 0.033668 3.288628e-003

Now, start the actual measurement process.
The loop will be excuted in 5346 times
This will take about one minute.
Wait for a while

cpu : 44.068811 sec.
Loop executed for 5346 times
Gosa : 6.575345e-007
MFLOPS measured : 1997.700906
Score based on Pentium III 600MHz : 24.115173



2並列の結果

>mpiexec -n 2 himeno2.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 67
imax = 64 jmax = 64 kmax =65
I-decomp = 1 J-decomp = 1 K-decomp =2
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 2082.186924 time(s): 0.023727 3.302404e-003

Now, start the actual measurement process.
The loop will be excuted in 7586 times
This will take about one minute.
Wait for a while

cpu : 39.938608 sec.
Loop executed for 7586 times
Gosa : 2.382049e-008
MFLOPS measured : 3127.899239
Score based on Pentium III 600MHz : 37.758320



4並列の結果

>mpiexec -n 4 himeno4.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 35
imax = 64 jmax = 64 kmax =33
I-decomp = 1 J-decomp = 1 K-decomp =4
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1869.251395 time(s): 0.026429 3.293020e-003

Now, start the actual measurement process.
The loop will be excuted in 6810 times
This will take about one minute.
Wait for a while

cpu : 42.718009 sec.
Loop executed for 6810 times
Gosa : 7.458185e-008
MFLOPS measured : 2625.239633
Score based on Pentium III 600MHz : 31.690483


プロフィール

カネダック

Author:カネダック
 
普通のC++プログラマですが、業務で流体解析をやっていて格子職人と呼ばれています。
J.S.バッハ等、古楽をピリオド楽器による演奏で聴くのが好き。
リュート演奏にあこがれつつ、クラシックギターを弾きます。

保有資格
・中小企業診断士
・Oracle Master 8 Platinum(今のGold相当)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。