マルチコアの並列とソフトウェアの並列は違うんじゃない
Posted on | 8月 28, 2007 | No Comments
Wiredにクロック向上からマルチコア化についてのIntelのマネージャの話でプログラマはハードの進化にただ乗りして性能の向上を享受しているとかうんぬんなどという記事が出ていて少し違うんでないの?と思った話。
Why You’re Not Getting Your Money’s Worth Out of That New CPU
並列処理というのはなにも新しい話ではない。何年も前からやってる話。私が知っているのは、まだバス結合方式とかなんとかでやっていたころ。ハイパーキューブなんて懐かしい。結局粒度の荒いものしか実用にならず、高粒度の並列処理はスパコンや科学技術計算などの一部の領域でのみ使われるにとどまった。あとはCPU内部のような表からは見えないところで活用されている(スーパースカラとか)
ハードウェアの場合複数のコアを束ねるに当たって解決すべき問題は、もちろん数々あるのはある程度はわかっているつもりだが、あくまで技術的な進歩により解決可能なものが多いように見える。基本的にクロック向上、パイプライン化が限界に達し、ピープホールな並列実行であるスーパースカラもそうそうは性能アップにならない、次の手としては並列化の粒度を上げてマルチCPUにしてしまおうという話だし。
しかしソフトウェアについてはそう簡単にはいかない。ほとんどのアルゴリズムは一本道で解決を行う。もちろん並列性がないわけではないが、人間の思考携帯もそうであるし、プログラムというのがいわば手順を書いた文章であるという性格上、今のところ有効に並列性を記述する方法はないように見受けられる。基本的にもともとが並列なものであり比較的セマンティックス的な意味の少ないハードウェアでの並列性とソフトウェアの並列性は性格が違うのである。しかも今回はハードウェアは荒い方向へと向かい、ソフトウェアには細かく並列度をみろという。なんか矛盾している。
ここでは上のWebで述べられているような、中~高粒度の並列処理を考えてみる。 結局並列処理はあるタスクを垂直・水平に分割してそれぞれを同時に実行することで行われる。まさにパイプライン処理、 スーパースカラのようなもんである。今のところ他にいい方法は不勉強で知らない。単純にはタスクを複数段のソフトウェアで分割構成するか、同じソフトウェアを複数個走らせるかである。
私は組み込みエンジニアで、ハード及びリアルタイムOSを長年扱ってきた。ほとんどがマルチタスクで動作し、複数CPUで構成されるシステムも多い。性能向上のために複数CPUで処理したり、機能分割されていたりと構成は様々である。どのケースでも出来るだけ最適な処理を設計してきたつもりであるが、これを一般化するのは困難と思っている。明確に構成できるものは別とすると、最後はいわゆる職人芸的なやり方である。システムの仕様から並列性を抽出し、共有リソースをきっちり守りながら動作させるのは単純なソフトウェアより難しいことが多い。
結局やることはKISSと似た考えだ。共有リソースは出来るだけ少なくし、お互いの影響がないような並列性を重要視して設計することである。 結果複数のタスクが同時に走ってもほとんど性能にも動作にも影響がないようになりスループットも応答性も向上する。つまり出来るだけシングルタスクのものを並列に動かし粒度を上げる考えである。
ソフトウェアの並列性は十分に粒度が高いものは機械的に処理できるためコンパイラやOSで解決できるかもしれない。粒度が荒いものは機能分割という形で既に実現されている。最もややこしいのが中~小粒度のものだ。これの難しさは分割単位が対象ごとに異なりはっきりしないところにある。要するにいくらプリミティブな並列処理の道具立てを用意しても、なかなかフィットしないところにあると思う。もちろん教育も必要だが、全ての事柄が同時に起こるわけではないのである。
全体のコード量が多くなればなるほど共有リソースや複数のスレッドが動作することによる複雑性が増していく。ぶっちゃけソフトウェアエンジニアはそんなの制御してられないのである。本来のソフトウェアのやりたいことはもっと他にいくらでもある。並列性なんかにかまっていられないのだ。せいぜいソフトウェアの機能分割によるマルチスレッド化くらいだろうか。
もちろん動画エンコードや画像処理など比較的分割しやすい問題や、CPUパワーの必要な複数のアプリを走らせたりといった非常に荒い使い方には有効であるが、誰もがいくつものCPUパワーの必要な仕事を同時にするわけではない。サーバなどの用途だとサーバとデータベースが同時に動作するといったプロセスレベルの並列処理でほとんど十分である。
マルチコアはいいと思うがサーバ領域での需要は高まり、コンシューマでは早々に限界が来る。本当に家庭のマシンに(もちろんオフィスにも)64コアのCPUを入れたいなら、プログラミングというよりコンピュータそのもののパラダイムの変化が必要だと思うが、今はまだ形もない。ワードプロセッサにどれだけの並列性があるだろうか?(いや、ないとは言わないし、やってほしいが)。
そもそも今のCPU自体がC系のオブジェクトコードに向けて最適化されていて、シングルタスク向けに作られているではないか。ソフトウェアはもっと目的志向の別な領域にフォーカスしているべきだ。インフラたるべきインテルの立場から技術の限界をもってフリーライド云々いうのはお門違いである。
なんて偉そうに書いたけど、要はそんなの面倒でやってられないよ!って感じかな。 いや必要な時はやってるけどね。
Comments
Leave a Reply