スキップしてメイン コンテンツに移動

投稿

6月, 2009の投稿を表示しています

C++: インテル スレッディング・ビルディング・ブロックを使って簡単に並列化

最近はマルチコアCPUが当たり前になってきて、それを使って簡単に並列処理プログラミングができないか、頭を悩ませていたのだが、インテルのスレッディング・ビルディング・ブロック(Threading Building Blocks, TBB)が非常に良くできた技術であることを知った。

これまではMPIやら、OpenMPやら、CUDAやらをちょろちょろ手を出しつつも、どれも正直面倒だった。趣味のプログラミングではそれでも楽しいからいいのだけど、単にある処理を並列化で高速にしたいだけの場合、並列処理に関わる面倒な手続きなどは極力省きたい。また、どうしても泥臭いやり方になることが多い。例えば、Cでは簡単に書けるのだけど、C++の機能を使った処理がやりづらかったりね。

そこで、TBBが登場する。マルチコアやメニーコアプラットフォーム上での利用となるが、最近では一般のノートPCでさえマルチコアCPUが使われていることを考えると、世にある様々な並列処理環境のうち、マルチコアCPUでの並列化がもっとも望まれているだろうと思う。実際、自分もマルチコアCPU上での並列処理が簡単にできないものかとよく考えていた。それに、従来の泥臭さの残る並列化に比べて、C++テンプレートによるコーディングスタイルはスマートだ。

さて、TBBを利用するにはTBB公式サイトからダウンロードしてくればよい。オープンソース版が用意されているので、それを使って自由にプログラムを作成できる。また、このサイトにはチュートリアルやリファレンスも用意されている。さらに、日本語版のドキュメントもXLsoftのTBBサイトから利用できる。ここのチュートリアルを一通り読めば大抵の場合で利用できるようになるだろう。

今回は、「はじめてのCUDAプログラミングで分子動力学計算」で作成したC++版のなんちゃって分子動力学(MD)計算プログラムをTBBを利用して並列処理を行ってみた。非常に簡単だった。相互作用計算の関数を関数オブジェクトに変更しただけだ。TBBについて知っていれば5分もかからないかもしれない。こんなに簡単に並列化ができるのであれば、もっと早くに知りたかった。まあ、百聞は一見に如かず、今回使ったコードを下に示す。青(水色)で示した部分が書き加えたコード、赤(ピンク)で示した部分が削ったコード、水色とピンクのコードは…

プログラミングができるということは、人生を楽にできるということ

どのようにプログラマになったのか知るのは面白く、興味深い。そして、プログラミングに対するの様々な考え方や捉え方を知り、それを自分の知識に加えるのが楽しい。そこで自分自身がどのようにしてプログラミングを学んできたのか、そしてプログラミングについてどのように考えているのか述べたいと思う。たいした内容でもないが書いているうちに長文になってしまった。取り敢えず概要だけを知りたい方は、それぞれの段落の最初の文章を読めば何となく分かると思う。

最初のプログラミング

初めて触れたPCは、父親が購入したNECのPC-8801mkIIだった。当時のPCには最初からBASIC(N88-BASIC)が付属しており、これを使って手軽にプログラミングができた。ただ、BASICはインタプリタであり、当時のPCの性能と相まって処理速度が非常に遅く、高速化のためにはアセンブラが必要だった。そこで、父親の書籍を漁りつつ、ニーモニックをハンドアセンブルでマシン語に変換したりもした。

しかしながら、BASICのプログラミングですら当時の自分にとってはとても難しく感じた。その頃読んでいたマイコンBASICマガジンに載っていたプログラムのようなコンパクトでエレガントなコードに比べ、自分のコードはなんて拙くて汚いのだろうと何度も思ったものだ。結局、プログラミングはセンスがある人だけのもので、自分には無理なのだろうかとさえ考えた。あるアイデアがあっても、それを思ったようにコードに落とせないのだ。毎回リファレンスとのにらめっこになる。それでも何とか書き上げたコードは不必要に肥大であり、分かりにくく、あちこちからバグが顔を出していた。

それでも、不細工だろうが何だろうが、プログラムが完成するのはとても嬉しいことだった。自分の力でゼロから何かを作り上げるという行為は本当に楽しかった。後に気が付いたことだが、プログラミングはセンスなんかよりも、この「楽しい」という気持ちの方がよほど重要だったのだ。センスがあっても楽しくなければ長くは続かないだろうし、楽しいと思っているのならば小さな積み重ねが経験となり、知識となっていく。

ただ、その当時はプログラミングばかりをしていたわけではなかった。PCゲームにもはまっていた。オールマシン語が売り文句の一つだった頃だ。そして、その頃のゲームソフトは個人もしくは少数の突出したプロ…