メニーコアのプログラミングを考える上で重要なのは:
- 並行(concurrent)プログラミング
- 並列(parallel)プログラミング
の違いです。
この点をセッションでも触れようと思っていたのですが、結局スライドを作りそこねてしまいました。
この2つの用語はいろいろな意味で使われていて、場合によっては同じ意味で用いられるケースもあると思いますが、セッション内では以下の用法を想定しています。
- 並行プログラミング
- 同時並行に動作する複数の処理を複数のタスクによって同時に実行する
- 並列プログラミング
- ひとつの処理を並列に動作する複数タスクの協調動作で実行する
たとえば、外部イベントで駆動される処理の場合、並行プログラミングは同時期に発生する複数の外部イベントに対応する処理が同時に動作するのに対して、並列プログラミングは1つの外部イベントに対応する処理が複数のCPU上で並列動作して高速に処理を完了する、というような違いになるかと思います。
ここでいう並行プログラミングはメニーコアでなくても普通に発生する問題で、今までもスレッド技術である程度うまく扱えていた問題です。Javaでいうとサーブレットの技術が相当します。
一方、メニーコア時代に入って問題となるのが一つの処理をメニーコア上で高速動作できないのか、という点です。たとえば、100の処理量のある処理を100コアを使って1の時間で実行できないのか、ということです。この問題は「同時並行に動作する複数の処理」を捌くためのプログラミング・モデルである「並行プログラミング」ではうまくさばけない、あるいは効果が限定的なのではないのか、という懸念につながります。
この観点から並列プログラミングに期待が集まるわけです。ボクも並列プログラミングに詳しいわけではないですが、関数型言語のモナドを使うとかなりうまく扱えそう、ということがScalaプログラミングを通じて分かってきました。
そういうわけで、今回のセッションのテーマの一つはモナドを使った並列プログラミングとなります。OFPによる新三種の神器の「モナド」の具体的な適用分野ですね。
0 件のコメント:
コメントを投稿