2009-05-31[n年前へ]
■続 エクセル2007のマルチスレッド機能
エクセル2007のマルチスレッド機能について調べていると、こんな記事がありました。この記事に書かれている結果からは、マルチスレッド機能の効果は大きいように見えます。少なくとも、マルチスレッドか、シングルスレッドであるかの違いは大きいように思えます。
Time to recalculate MBRM UNIVOPT benchmark speed test spreadsheet
Test 1: Single core machine
Using Excel 2003 69.5sec.
Using Excel 2007 69.5sec.
Test 2: Dual-core machine
Using Excel 2003 88.97sec
Using Excel 2007 with 1 calculation thread 88.8sec.
Using Excel 2007 with 2 calculation thread 45.74sec.
Using Excel 2007 with 3 calculation thread 45.03sec.
それでは試しに、というわけで「ベンチマーク for Excel 2000」で、マルチスレッド機能(CPU数=1 or 2)の違いを見てみました。その結果が下の2つのグラフ(の赤表示部分)です。上がマルチスレッド有効にした場合で、下がシングルスレッドの場合になります。スレッド数での違いは、やはりほとんど見られません。
とはいえ、ファイル保存形式を変えてみても、エクセルのメニューバーには「互換モード」と表示されているのが気にかかるところです。もしかしたら、今回試してみた方法では、Excel 2007特有の機能は使われていないのかもしれません。
・・・というわけで、やはり、エクセルに深入りすると、必ず恐怖の時間底無し泥沼が待っているような気持がしてきました。
2009-06-06[n年前へ]
■並列アプリケーションを作ってみよう
並列処理は、一般には実装が難しい、という印象があるようだ。確かにスレッドを駆使して処理を並列化する場合、スレッドの管理やスレッド毎の連携など、考慮しなければならないことが増え面倒ではある。しかし、プログラムを並列化するための言語規格「OpenMP」や、C++用の並列化ライブラリ「Threading Building Blocks」といった並列化支援技術を利用することで、プログラムの並列化へのハードルは大幅に低くなる。・・・本記事では、このような技術を利用した並列処理の実装方法を、簡単な画像処理アプリケーションを例に説明していこう。
2009-07-02[n年前へ]
■「Suprercomputing Engine for Mathematica(SEM)」のご案内
「Suprercomputing Engine for Mathematica(SEM)」講習会
Supercomputing Engine for Mathematica(SEM)は、Mathematicaを真に並列環境で使うためのツールとして注目を浴びています。現在、お使いのMathematicaプログラムを並列化によって高速実行させたい、あるいは、すでにgridMathematicaのライセンスを保有しているが使われず死蔵している方に特にお勧めの講習会です。
SEMについては、次のページをご覧ください。
2009-09-01[n年前へ]
■Microsoft C++ 2008 Expressで「OpenMP対応のOpenCV」と「”消しゴム版画風”画像作成ソフト」をビルトする
読めばワクワク楽しくなる「詳解 OpenCV」を読み、何だかOpenCVを使ったプログラミングをしたくなったので、無償で使うことができる開発環境Microsoft Visual C++ 2008 Express Editionで、先日、OpenCVの最新(trunk)版をビルドしてみました。
ちなみに、Windows SDK for Windows Server 2008 and .NET Framework 3.5をインストールすると、Microsoft Visual C++ 2008 Express Editionでも、OpenMP(並列計算ライブラリ)を使う設定でOpenCVをコンパイルすることができますので(上位バージョンなら必要ファイルが最初からインストールされています)、なるべく高速に計算させたいという人は、上記ライブラリをインストール後に、OpenCVライブラリをビルドし直しても良いかもしれません。
ちなみに、そういった作業をしてみると、上記必要なヘッダファイルや、デバッグ版・リリース版のライブラリが、CisualC++のディレクトリにインストールされ使うことができるようになり、それらファイルを読みに行くようしておくことで、Microsoft Visual C++ 2008 Express Editionで「OpenMP対応のOpenCV(trunk版)」をビルドすることができました。
・・・と、これだけではつまらないので、せっかくですからOpenCVを使って書かれている”消しゴム版画風”画像作成ソフト(「ナンシー"小"関 風 パッチもん版画」作成ソフト)を(ソースファイルを修正し)、ビルドしてみることにします。ソースファイル・バイナリはここに置いてありますので、そこから試しに nancyKOseki20060719.cpp をダウンロードします。そして、3行目の
#include "stdafx.h"をコメントアウトし、メイン関数の
int _tmain(int argc, _TCHAR* argv[])を
int main(int argc, char* argv[])とします。そして、OpenCV trunk版をビルドすることで作成される各種ライブラリ
highgui111.lib cxts111.lib cv111.lib cxcore111.lib ml111.lib cvaux111.lib cvhaartraining.libを「追加の依存ファイル」に追加したプロジェクトを作成し(ここで作成したプロジェクトファイルを使いまわすと、設定が面倒でなくて良いかもしれません)、そこに上記で修正した nancyKOseki20060719.cpp を加え・ビルドすると、Miscrosoft C++ 2008 ExpressでOpenMP使用のOpenCV trunk版を用いてコンパイルした「”消しゴム版画風”画像作成ソフト」ができあがる、というわけです。
今回は、OpenMPを使って書きなおしたわけでなく、単にMiscrosoft C++ 2008 Expressで(OpenMP使用の)OpenCV trunk版を使って、コンパイルを通るようにしてみただけですが、ソースファイルから実行できるアプリケーションを作成したり・自分なりのカスタマイズをしたりし始めると、少しワクワクしてくるかもしれません。
そして、クロス・プラットフォームの便利さを活用し、たとえば、iPhone版、mixiアプリ版、WEBアプリ版・・・といったものと同じように、さまざまな環境下で動くように改造したりしてみるのも面白いかもしれません。
2009-10-06[n年前へ]
■無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる
今日も、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使って色々なことをしてみよう、という話の続きです。もちろん、さらにパワーアップした可能性を追求してみたいと思います。
数式処理環境であるMathematicaには、オプション製品としてgridMathematicaという製品があります。Mathematicaでグリッド・コンピューティングを実現する、というようなネーミングの製品ではありますが、実際にはMathematicaで並列(パラレル)計算を実現するための拡張オプションです。価格は・・・眼の球が10cmくらいは前に突き出てしまうほどのお値段になっています。
さて、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使えば、色々なことができるわけです。そこで、今日はgridMathematicaが可能にするようなことを、誰でも入手可能なツールで実現してみることに挑戦してみようと思います。
本来ならば、分散処理環境をRubyで実装したdRubyなどを使いたいところですが、いくつかの理由から、今日は(IronRubyで動作する)ごくごく普通のRubyライブラリを使って、Mathematicaカーネルをネットワーク上で並列計算させることができるコードを書いてみることにします。
まずは、(無料配布されている)Mathematicaカーネルを扱うサーバ・アプリを書いてみます。といっても、単にこれだけのコードです。
class Mathematica require 'Wolfram.NETLink' include Wolfram::NETLink def initialize() end def open @kernelLink=MathLinkFactory.CreateKernelLink() @kernelLink.WaitAndDiscardAnswer() end def do(command) @kernelLink.EvaluateToInputForm(command, 0) end def close @kernelLink.EvaluateToInputForm('MVClose[]', 0) end end require 'webrick' include WEBrick m=Mathematica.new m.open s=HTTPServer.new(:Port=>ARGV[0].to_i, :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' if /evaluate\/(.+)$/=~req.path res.body=m.do($1) end } trap("INT"){m.close;s.shutdown} s.startこれは、例題のため、多くの処理をはしょっていますが、例題の範囲ではきちんと動作するコードです。ひとことで言えば、URIを介して渡されたコマンドを実行した結果を返すWEBサーバアプリです。
ちなみに、このスクリプトを mathematicaServer.rb と名付ければ、
ir.exe mathematicaServer.rb 80という具合で、ポート80番でコマンドを待ち受けるWEBサーバが起動します。あるいは、
ir.exe mathematicaServer.rb 81とすれば、ポート81番でコマンドを待ち受けるWEBサーバが起動します。複数台のPC上で実行しても構いませんし、あるいは、(テスト用として)一台のPC上で複数のサーバを実行しても構いません。もちろん、多数台のPC上でサーバー群を立ち上げる方が高性能になるのは言うまでもありません。
さて、ここまで来たら、後はそれらのサーバ群に"Mathematica"による並列計算をさせるスクリプトを書いてみることにしましょう。たとえば、こんな感じです。
require 'pp' require 'net/http' Net::HTTP.version_1_2 result=[] threads = [] command='2+2' uri=['localhost','localhost'] port=[80,81] 2.times do |i| threads.push( Thread.new do Net::HTTP.start(uri[i],port[i]){ |http| r=http.get('/evaluate/'+command); result<<r.body;} end ) end threads.each do |t| t.join end pp resultこのスクリプトをmathematicaController.rbとでも名付け、
ir.exe mathematicaController.rbという風に起動してやります。もちろん、この並列計算を行わせるコントローラ側はIronRubyである必要はありませんから、
ruby mathematicaController.rbでも構いませんし、計算サーバ群は結局のところ単なるWEBサーバ群なのですから、Rubyプログラムである必要もありません。
このスクリプトの内容はとても簡単です。上の例であれば、ローカルPC上で動いている、2つのMathematicaカーネルを使ったサーバに対して、"2+2"という計算をパラレル(並列)に投げて、その結果を受け取りまとめているわけです。その結果、
["4","4"]という計算結果が最終的には手に入ることになります。httpを使い、また、コマンドのをエンコード処理を行わずGETで投げつけていますが、それはあくまで簡単なテスト用であるためです。
Mathematicaという最高の開発環境を使い、並列計算も可能にし、さらに、そういったプログラムを自分で書くことができる・・・なんて、とても楽しそうではありませんか?この「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRubyを使って、遊んでみよう」というシリーズ!?の可能性はまだまだ広がりそうです。
さまざまなデータに対し透過的にアクセスが可能で、並列計算もとても簡単にできたなら、色々なことができそうだ、と思えますよね?無料配布のMathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheaticaコンピューティングのプログラムは、実際のところ5分程度で作ることができます。
無料配布のMathematicaカーネルなのに、それが実に多くのことができることに驚かされます。少し時間ができたとき、こんなプログラムを作って遊んでみるのはいかがでしょうか。