ラベル MPI の投稿を表示しています。 すべての投稿を表示
ラベル MPI の投稿を表示しています。 すべての投稿を表示

2012年1月21日土曜日

Python:MyMPIで円周率の計算バージョン1



def f(x):
    return 4.0/(1.0+x*x)


def main():
    import numpy
    import mpi
    from mpi import mpi_init, mpi_finalize
    from mpi import mpi_comm_size, mpi_comm_rank, MPI_COMM_WORLD
    from mpi import mpi_reduce, mpi_bcast, mpi_barrier,mpi_recv, mpi_send
    from mpi import MPI_SUM, MPI_FLOAT,MPI_INT,MPI_TAG_UB
    import sys

    sys.argv = mpi_init(len(sys.argv),sys.argv)

    number_of_proc = mpi_comm_size(MPI_COMM_WORLD)
    myid = mpi_comm_rank(MPI_COMM_WORLD)
    main_node = 0
    n = 10000
    
    #mpi_bcast(n, 1, MPI_INT, 0, MPI_COMM_WORLD)

    h = 1.0 / n
    sum = 0.0

    for i in range(myid,n,number_of_proc):
        x = h * (i -0.5)
        sum += f(x)

    mypi = h * sum

    #mpi_barrier(MPI_COMM_WORLD)
    
    cpi = mpi_reduce(mypi, 1, MPI_FLOAT,MPI_SUM, 0, MPI_COMM_WORLD)

    if myid == main_node:
        print cpi
    
    mpi_finalize()

if __name__=="__main__":
    main()

結果は [ 3.14179277] 

お試しあれ。


このエントリーをはてなブックマークに追加



2012年1月20日金曜日

Python でお気楽並列コンピューティング:MYMPIの使い方




example1.py
import numpy
from numpy import *
import mpi
from mpi import *
import sys
sys.argv = mpi.mpi_init(len(sys.argv),sys.argv)
print "after ",len(sys.argv),sys.argv
myid=mpi.mpi_comm_rank(mpi.MPI_COMM_WORLD)
numprocs=mpi.mpi_comm_size(mpi.MPI_COMM_WORLD)
print "Hello from ",myid
print "Numprocs is ", numprocs
print "python is not about snakes"
mpi.mpi_finalize()

mpirun --hostfile hosts -np 40 python example1.py

hosts ファイルの書き方

hoge@192.168.1.11 cpu=4 
hoge@192.168.1.12 cpu=4 
hoge@192.168.1.15 cpu=4
hoge@192.168.1.16 cpu=4 
hoge@192.168.1.17 cpu=4 
hoge@192.168.1.19 cpu=4 
hoge@192.168.1.20 cpu=4 
hoge@192.168.1.23 cpu=8 
hoge@192.168.1.24 cpu=16

とすること

server1@~/test_mympi> mpirun -host hoge@192.168.1.14 -np 3 python example1.py
Traceback (most recent call last): File "example1.py", line 2, in import numpy ImportError: No module named numpy Traceback (most recent call last): Traceback (most recent call last): File "example1.py", line 2, in import numpy ImportError: No module named numpy File "example1.py", line 2, in import numpy ImportError: No module named numpy

となぜかnumpyを認識していないノードはhostsファイルから除く。
後日なぜかを調査予定。


うまくいくと、以下のようになる


server1@~/test_mympi> mpirun --hostfile hosts -np 10 python example1.py
[puzzle15:26782] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27440] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle15:26783] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23530] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27439] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27441] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27442] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23529] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23531] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23532] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
after  1 ('example1.py',)
Hello from  6
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  8
after  1 ('example1.py',)
Hello from  2
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  0
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  3
Numprocs is  10
python is not about snakes
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  9
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  4
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  5
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  7
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  1
Numprocs is  10
python is not about snakes

このエントリーをはてなブックマークに追加



Python でお気楽並列コンピューティング:MYMPIのインストール



http://sparx-em.org/sparxwiki/MPI-installation
からMYMPIをインストールしてきて展開。

python 2.5.2
openmpi-1.2.8

が入っていれば、
python install_mpi.py --mpiroot=/home/openmpi/
でオッケー。

私はtcshを使っているので、.cshrc ファイルに
setenv LD_LIBRARY_PATH $HOME/openmpi/lib
とパスを通しておく。

これで
python
import mpi
としてうまく行けばオッケー。



このエントリーをはてなブックマークに追加



2012年1月19日木曜日

Python でお気楽並列コンピューティング:openmpi-1.2.8 のインストール



今、MYMPIを使おうと四苦八苦していますが、
その覚え書きを書いていく。

まず、openmpi-1.2.8の導入で躓いた。
libtool のバージョンが違うというエラー。
コンピュータのlibtoolのバージョンは1.5.8。
2.1aを要求されているようなので、libtoolのサイトに探しに行ったが、
無い。
仕方なく2.4.2なるものを入れてみたがやっぱりこけた。
2.2.2にしてもこける。

make distclean でフォルダーを初期化(make maintainer-clean)。

make distclean
autoreconf --force --install
./configure --enable-shared --prefix=/home/openmpi/
make
make install

make のところでやっぱりこける。

../../libtool: line 463: CDPATH: command not found
../../libtool: line 1266: func_opt_split: command not found
libtool: Version mismatch error.  This is libtool 2.1a, but the
libtool: definition of this LT_INIT comes from an older release.
libtool: You should recreate aclocal.m4 with macros from libtool 2.1a
libtool: and run autoconf again.

なんやねん!

[追記]
さらにググってみる。
m4のバージョンが1.4.11だけどこれがだめなのか????
http://blog.k-tai-douga.com/article/26604536.html

libtoolまわりを疑ったがどうやら
tarballからの展開してインストールするのにauto tools は必要ないらしい。
(openmpi Q&Aより。)

そこでもう一度tarballの展開からはじめて見た。

tar jxf openmpi-1.2.8.tar.bz2
cd openmpi-1.2.8
./configure --enable-shared --prefix=/home/openmpi/
make all install
なんと通った。

考察
make all install が有効だった?(make  make installではなく)
結局なんで最初うまくいかず、今回うまくいったのかよくわからないけど。。。。

良かったー ;-)

[自分用メモ書き]
tar jxf openmpi-1.2.8.tar.bz2


参考サイト
http://www.fireproject.jp/feature/automake/basic/intro.html





このエントリーをはてなブックマークに追加



Python でお気楽並列コンピューティング:MYMPIとpyMPIの違い



両者はmpi のpython ラッパーであるが、その違いは。。。。

pyMPI はモジュールを伴ったPython インタプリタでありMPI_Initを明示的に呼び出すことはない。
mympi は明示的にMPI_Initを呼ぶ。つまり、より細かく、MPI_Initを呼び出すタイミングを制御できる。また、MYMPIはインタプリタではなく単なるモジュールなため、それだけサイズがちいさい。
このエントリーをはてなブックマークに追加



2011年12月31日土曜日

--disable-dlopenとは openmpi インストール オプション




    Can I disable Open MPI's use of plugins?


    --disable-dlopen: Using this option to Open MPI's configure script will do two things:

    1. Imply --disable-mca-dso, meaning that all plugins will be slurped into Open MPI's libraries.
    2. Cause Open MPI to not look for / open any DSOs at run time.
    slurp 音を立てて飲食する

    OPENMPIのプラグインの使用を無効にできますか?

    --disable-dlopen: これをつかって2つのことができます。
    1. --disable-mca-dsoみたいに、すべてのプラグインがOpen MPIのライブラリに取り込まれます。
    2.   ランタイム時にopen mpi はDSOsをさがしにいきません。

    DSOs(dynamically shared objects) 動的共有ライブラリ 

    このエントリーをはてなブックマークに追加



    2011年12月29日木曜日

    Pythonでお気楽並列コンピューティング2: mpi4py





    python master.py
    3.14160098692

    master.py
    masterとしてはたらく

    #!/usr/bin/env python
    from mpi4py import MPI
    import numpy
    import sys
    
    comm = MPI.COMM_SELF.Spawn(sys.executable,
                               args=['cpi.py'],
                               maxprocs=5)
    
    N = numpy.array(100, 'i')
    comm.Bcast([N, MPI.INT], root=MPI.ROOT)
    PI = numpy.array(0.0, 'd')
    comm.Reduce(None, [PI, MPI.DOUBLE],
                op=MPI.SUM, root=MPI.ROOT)
    print(PI)
    
    comm.Disconnect()
    



    cpi.py
    #!/usr/bin/env python
    from mpi4py import MPI
    import numpy
    
    comm = MPI.Comm.Get_parent()
    size = comm.Get_size()
    rank = comm.Get_rank()
    
    N = numpy.array(0, dtype='i')
    comm.Bcast([N, MPI.INT], root=0)
    h = 1.0 / N; s = 0.0
    for i in range(rank, N, size):
        x = h * (i + 0.5)
        s += 4.0 / (1.0 + x**2)
    PI = numpy.array(s * h, dtype='d')
    comm.Reduce([PI, MPI.DOUBLE], None,
                op=MPI.SUM, root=0)
    
    comm.Disconnect()
    
    

    このエントリーをはてなブックマークに追加



    Pythonでお気楽並列コンピューティング: mpi4py



    我がMacbook Airでは
    easy_install mpi4py
    で自動的にmpi4py 1.2.2がダウンロード&インストールされる。
    簡単すぎて、pythonでのインストールの仕方&仕組みを忘れそう。怖い。

    次にプログラム

    プログラム1
    #!/usr/bin/env python
    """
    Parallel Hello World
    """
    
    from mpi4py import MPI
    import sys
    
    size = MPI.COMM_WORLD.Get_size()
    rank = MPI.COMM_WORLD.Get_rank()
    name = MPI.Get_processor_name()
    
    print "Hello, World! I am process %d of %d on %s." % (rank, size, name)
    



    実行結果

    mpirun -np 4 python helloworld2.py
    Hello, World! I am process 1 of 4 on MacBook-Air.local.
    Hello, World! I am process 2 of 4 on MacBook-Air.local.
    Hello, World! I am process 0 of 4 on MacBook-Air.local.
    Hello, World! I am process 3 of 4 on MacBook-Air.local.













    このエントリーをはてなブックマークに追加



    2011年12月26日月曜日

    MPI (Message Passing Interface)について



    Message Passing Interface (MPI)とは、並列コンピューティングを実現する規格である。

    その実装の一つにOpen MPI がある。
    とりあえず、クラスターのmpiのバージョンをチェック(普通HPCにはデフォルトでmpiが入っている)。

    mpirun -version
    mpirun (Open MPI) 1.3.2

    目標はpythonでmpiを使うことである。
    MPIのpythonバインディングは MyMPI。

    MPIの役に立ちそうなサイトを並べておく
    http://mikilab.doshisha.ac.jp/dia/smpp/cluster2000/
    http://mikilab.doshisha.ac.jp/dia/smpp/cluster2000/PDF/chapter02.pdf

    このエントリーをはてなブックマークに追加