hirax.net::Keywords::「並列計算」のブログ



2009-10-21[n年前へ]

無料のMathematicaカーネルとIronRubyでP2Pグリッド数式処理システムを作ってみよう 

少し前、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使い、「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」 という記事で、Mathematicaで並列計算を可能にするためのコード例を書きました。制御用マシンと計算用サーバ間の通信はhttpを使い、多数のサーバ群で高機能数式処理並列計算を実行することができるシステムを無料で構築しよう、というアイデア・実装です。

 今日は、その時書いたコードをもう少し書きなおしてみました。書き直した点をひとことで言えば、それは「制御用マシン(用ソフト)」「計算用サーバソフト」といった区別をなくしたクラスを作ってみたということになります。また、それに加えてコマンドの投げ方を替えた&コマンドを投げる際にURLエンコードをかけるようにした、という変更を行いました。それが、下の(Iron)Rubyクラスです。

 というわけで、まずはこんなコードを書いてみましょう。名前は、mathnode.rbとでもしておきます。

class Mathematica
  require 'Wolfram.NETLink'
  include Wolfram::NETLink
  PAR="-linkmode launch -linkname
 'C:\\Program Files\\Wolfram Research\\
Mathematica Player\\7.0\\MathKernel.exe'"
  def initialize()    
  end
  def open
    @kernelLink=MathLinkFactory.CreateKernelLink(PAR)
    @kernelLink.WaitAndDiscardAnswer()
  end
 def do(q)
     @kernelLink.EvaluateToInputForm(q, 0)
  end
  def close
    @kernelLink.EvaluateToInputForm('MVClose[]', 0)
  end
end

class Mathnode
  require 'webrick'
  include WEBrick
  require 'net/http'
  require 'uri'  
  Net::HTTP.version_1_2
  attr_reader :server
  
  def initialize()    
    @m=Mathematica.new
    @m.open
  end

  def start(port)
    @server=Thread.new do
      @s=HTTPServer.new(:Port=>port, 
                             :DocumentRoot=>'',
                             :RequestTimeout=>600,
                             :MaxClients=>1)  
      @s.mount_proc("/restart") {@m.close;@m.open}
      @s.mount_proc("/shutdown") {@s.shutdown}
      @s.mount_proc("/"){|req,res|
        res.body='use /evaluate/command'
        res.body=URI.encode(@m.do(URI.decode(req.query['q']) )) if req.query['q']
      }
      trap("INT"){@m.close;@s.shutdown}
      @s.start
    end
  end

  def stop
    @server.shutdown
  end
  
  def sendCommand(host,port,q)
    result=''
    Net::HTTP.start(host,port){ |http| 
        r=http.get('/evaluate?q='+URI.encode(q))
        result=URI.decode( r.body )
    } 
    result
  end

end
 このクラスを使い、たとえば、こんなコードを書きます。
require 'mathnode.rb'
mathnode=Mathnode.new
mathnode.start(ARGV[0].to_i)
mathnode.server.join
名前は、node.rbとでもしておきましょうか。そして、コマンドラインから、こんな風に実行します。引数は、httpでコマンドを待ち受けるTCP/IPのポート番号です。
ir.exe node.rb 80
これで、ポート番号80を用い、プロトコルはhttpで、コマンドを待ち受け続けるサーバが立ち上がります。

 さて、同じmathnode.rbを使って、今度は計算をさせるための制御用コントローラを書いてみましょう。名前は、main.rbとでもしましょうか。

require 'mathnode.rb'
mathnode=Mathnode.new
puts mathnode.sendCommand(
  'localhost',ARGV[0].to_i,
  'Solve[x+y==3,x]')
これで、先ほど立ち上げた「計算用サーバ」に対して、x+y==3という一次代数方程式をxについて解かさせるプログラムのできあがり、です。使い方は、
ir.exe main.rb 80
です。これで、localhostの80番ポートでMathematicaコマンドを待ち受けるサーバに、x+y==3という一次代数方程式をxについて解かせるプログラムの出来上がりです。

 重要なのは、「計算用サーバ」と「制御用コントローラ」は、主従関係にあるようなクラスではなく、完全に同一のクラスである、ということです。ですから、peer to peer でデータ・命令を投げ合うグリッド計算システムを書き上げることもできるわけです。

 もちろん、前回「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」で書いたようなプログラムとして、こんな風に書いても構いません。

require 'pp'
require 'net/http'
require 'uri'

Net::HTTP.version_1_2
result=[]
threads = []
command='Solve[x+y==3,x]'
uri=['localhost']
port=[80]
2.times do |i|
  threads.push( 
    Thread.new do
      Net::HTTP.start(uri[i],port[i]){ |http| 
        r=http.get('/evaluate?q='+URI.encode(command));
        result<<URI.decode( r.body );} 
    end
  )
end
threads.each do |t|  t.join end
pp result
 これでも、全く同じ計算結果を得ることができる、無料のMathematica並列計算環境ができあがります。

 実際の使い勝手としては、「制御用マシン」「計算用サーバ群」という作りでも良いような気もしますが、それだけではつまらないので、今日はP2Pグリッド数式処理システムを作ってみた、というわけです。無料で使える道具だけで作ることができて、なおかつ、広い可能性が感じられるもの、ではないでしょうか。

2009-11-19[n年前へ]

MATLABなら、コード1つで分散配列が可能 

 「MATLABなら、コード1つで分散配列が可能

 新しいPCT 4.2では、プログラム内に「distributed」というコードを1つ書き込めば、データ配列を複数のクラスタに分け、ローカル内の複数のワーカー(計算プロセス)に振り分けての計算が自動で行える。既存のアルゴリズムについても、分散化をするためにプログラムをわざわざ大きく書き直す必要がない。
 米MathWorks社の日本法人であるマスワークスジャパンは2009年7月1日に設立。それまでサポートを委託していたサイバネットシステムからの業務引き継ぎも順調だったという。またサイバネットシステム内のMATLABサポートエンジニアの移籍の了解も得たとのことだ。

2010-05-24[n年前へ]

日本IBM、GPGPUを搭載するHPC向けサーバー「iDataPlex 大規模並列処理モデル」  

 日本IBM、GPGPUを搭載するHPC向けサーバー「iDataPlex 大規模並列処理モデル」

 iDataPlex 大規模並列処理モデルは、x86サーバー「IBM System x iDataPlex dx360 M3」に、GPGPU(General-Purpose computing on GPU)を2個搭載したサーバー製品。このGPGPUは1個あたり448コアを搭載し、並列処理においては、CPUの20~150倍の処理スピードを発揮可能とのことで、1サーバーあたり1.13T FLOPSの性能を提供できる。またGPGPUは消費電力が大きく、発する熱量も大きくなるものの、iDataPlexの高い冷却効率を利用することで、専用の冷却ファン設置を不要とし、ファン用消費電力の削減を実現。消費電力あたりでは従来比8倍となる、約1.5G FLOPSの性能を実現した。



■Powered by yagm.net