最近、Sunとしてのプレゼンを作成するために、Parallel ComputingとConcurrent ComputingやMultiCoreの活用について情報を取りまとめ中。自分のメモと周りの意見を聞くために、本ブログで整理したいと思います。
Parallelは、日本語訳は並列。Instructionレベルでの同時多重処理を実現するのための技術。
Concurrentは、日本語訳は並行。Taskレベルでの同時多重処理を実現するための技術。
最近ではParallel ComputingがConcurrent Computingを含みつつあるようで、またConcurrentもPrallelの意味で使われていたりするようだが、大学でConcurrent Computingにたまたま興味を持った私個人としては、Parallelとは一緒にしてほしくないなぁと。Message型のErlangなどはConccurentかと。
さて、CPUのマルチコア化が進行するなかで、プログラマや技術者に対してParallel Programming, Concurrent Programmingの必要性が高まっています。さてどこから勉強すればいいのでしょう。簡単です。マルチスレッド、マルチプロセッサー環境で経験を積んで来たプログラマや技術者から学ぶことです。もちろん、1台の巨大なMT/MP環境だけでなく、Network 上でマルチノードを前提にしたGrid Computingからも学ぶことはできるのでしょう。UNIX環境で、マルチプロセスでのIPCに詳しかった先輩の知識も役に立つかもしれません。
簡単な方法があります。Javaです。Sunが主な開発を担って来た事もあり、SMP/Multi Thread環境で鍛え上げられています。Multi Thread programmingは基本ですし、Concurrent Utilityが、Java SE 5から入っています。マルチコア環境で活躍できることが容易に想像できます。
ただ、Logic関係であまりConcurrencyを要求されるようなケースは特にWeb Application platform上でシステムを構築するEnterprise領域ではまだまだ多いとは言えないのかもしれません。ただ、高負荷耐性、高スループットを求められるネットサービス系でlow levelからシステムを構築するケースでは、高いニーズがあるのではないでしょうか。様々なミドルウェアがMultiCore環境ではスケールしないことを考えると、これまでデフォルトで使っていたnetwork middlewareのstackも再検討が必要になるかもしれません。有名ミドルウェアについては、マルチスレッド実装が多くなってくると、javaの場合はNew IOの利用もキーワードですね。networkに限って言えば、Grizzlyなんかがその良い例です。
これ、エンジニアとしてのスキルアップの好機です。UNIXはセマフォ、共有メモリ、Socket、マルチプロセス等が使えるようになると昔は結構一人前として評価されました(最近は当たり前なのかどうかしりませんが・・・)。これからのプログラマは、MultiThread, Concurrent Programming, またそれらに強いMiddlewareと、最新のComputing Powerをきっちり使えるプログラマが評価されるのでしょうかね。
さて、Concurrent/Parallel computingは、programming、デバッグとチューニングが大変だということは容易に想像がつきます。Javaのライブラリや、NetBeansやDtrace、Solarisの価値が再認識されるとよいのですがね。
メモがメモでなくなってしまいました。オヤジの悪い癖です。あ、原体験からかもしれませんが、しかしConcurrent languageってロマンありますよね。(狭義のParallelは実はあんまり興味なかったりする。)
若造のころ、ハードの特性は考えずに、単なる受注処理にIPC使いまくりのMulti Processのプログラムを書いたのを思い出しました。(調子にのって、バッチまで書いた気がする。シーケンシャルよりリソース効率よく使えてたと勝手に思ってる。)今は、Concurrent Utilityがあって、lockをあまり気にせず、Threadでバリバリ動かせるので、根本的にその頃とは時代が違うのだろうと思いますが、シーケンシャルなロジックを並列化、並行化することはパズルというかゲームのようでとても楽しいものです。みなさんも是非挑戦してみてくださいませ。
その後、確認の意味で、SunのJava御大、山口さんと会話。Concurrent utilityの会話をしました。うーむ奥深いですね。ハードウェア同期プリミティブを使って、compare and setを行うところも重要だと。ああ、私はIPCのLock世代でした。Context switchを伴う、Lockのようなコストの高い方法でなく、高速な実装が今ではどこでも動くjavaでできるんですね。素晴らしいことです。
そう考えると、Java のConcurrent utilityって、Atomicなclass含め、Parallel Utilityなんですかね。最初の拘っていた定義が揺らぎます。javaの場合は、Concurrentっぽいものも沢山入っているので、両方ってところでしょうか。
multi nodeを考えると、parallelとconcurrent、もっと両面からの進化が必要かもしれませんね。
あらためて、javaってすごいですね、と思う。
Parallelは、日本語訳は並列。Instructionレベルでの同時多重処理を実現するのための技術。
Concurrentは、日本語訳は並行。Taskレベルでの同時多重処理を実現するための技術。
最近ではParallel ComputingがConcurrent Computingを含みつつあるようで、またConcurrentもPrallelの意味で使われていたりするようだが、大学でConcurrent Computingにたまたま興味を持った私個人としては、Parallelとは一緒にしてほしくないなぁと。Message型のErlangなどはConccurentかと。
さて、CPUのマルチコア化が進行するなかで、プログラマや技術者に対してParallel Programming, Concurrent Programmingの必要性が高まっています。さてどこから勉強すればいいのでしょう。簡単です。マルチスレッド、マルチプロセッサー環境で経験を積んで来たプログラマや技術者から学ぶことです。もちろん、1台の巨大なMT/MP環境だけでなく、Network 上でマルチノードを前提にしたGrid Computingからも学ぶことはできるのでしょう。UNIX環境で、マルチプロセスでのIPCに詳しかった先輩の知識も役に立つかもしれません。
簡単な方法があります。Javaです。Sunが主な開発を担って来た事もあり、SMP/Multi Thread環境で鍛え上げられています。Multi Thread programmingは基本ですし、Concurrent Utilityが、Java SE 5から入っています。マルチコア環境で活躍できることが容易に想像できます。
ただ、Logic関係であまりConcurrencyを要求されるようなケースは特にWeb Application platform上でシステムを構築するEnterprise領域ではまだまだ多いとは言えないのかもしれません。ただ、高負荷耐性、高スループットを求められるネットサービス系でlow levelからシステムを構築するケースでは、高いニーズがあるのではないでしょうか。様々なミドルウェアがMultiCore環境ではスケールしないことを考えると、これまでデフォルトで使っていたnetwork middlewareのstackも再検討が必要になるかもしれません。有名ミドルウェアについては、マルチスレッド実装が多くなってくると、javaの場合はNew IOの利用もキーワードですね。networkに限って言えば、Grizzlyなんかがその良い例です。
これ、エンジニアとしてのスキルアップの好機です。UNIXはセマフォ、共有メモリ、Socket、マルチプロセス等が使えるようになると昔は結構一人前として評価されました(最近は当たり前なのかどうかしりませんが・・・)。これからのプログラマは、MultiThread, Concurrent Programming, またそれらに強いMiddlewareと、最新のComputing Powerをきっちり使えるプログラマが評価されるのでしょうかね。
さて、Concurrent/Parallel computingは、programming、デバッグとチューニングが大変だということは容易に想像がつきます。Javaのライブラリや、NetBeansやDtrace、Solarisの価値が再認識されるとよいのですがね。
メモがメモでなくなってしまいました。オヤジの悪い癖です。あ、原体験からかもしれませんが、しかしConcurrent languageってロマンありますよね。(狭義のParallelは実はあんまり興味なかったりする。)
若造のころ、ハードの特性は考えずに、単なる受注処理にIPC使いまくりのMulti Processのプログラムを書いたのを思い出しました。(調子にのって、バッチまで書いた気がする。シーケンシャルよりリソース効率よく使えてたと勝手に思ってる。)今は、Concurrent Utilityがあって、lockをあまり気にせず、Threadでバリバリ動かせるので、根本的にその頃とは時代が違うのだろうと思いますが、シーケンシャルなロジックを並列化、並行化することはパズルというかゲームのようでとても楽しいものです。みなさんも是非挑戦してみてくださいませ。
その後、確認の意味で、SunのJava御大、山口さんと会話。Concurrent utilityの会話をしました。うーむ奥深いですね。ハードウェア同期プリミティブを使って、compare and setを行うところも重要だと。ああ、私はIPCのLock世代でした。Context switchを伴う、Lockのようなコストの高い方法でなく、高速な実装が今ではどこでも動くjavaでできるんですね。素晴らしいことです。
そう考えると、Java のConcurrent utilityって、Atomicなclass含め、Parallel Utilityなんですかね。最初の拘っていた定義が揺らぎます。javaの場合は、Concurrentっぽいものも沢山入っているので、両方ってところでしょうか。
multi nodeを考えると、parallelとconcurrent、もっと両面からの進化が必要かもしれませんね。
あらためて、javaってすごいですね、と思う。