[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10945] Re: Doug Lea 本



村山@netgeneです.

> ルチスレッド・プログラミングの意味と、並列処理による高速化技術の意味が
> 含まれる。しかし、同書には高速化技術の部分が大きく抜けている。
> ということに過ぎないのではないでしょうか?

いくつも問題がありますが,ちょっと整理すると,
#それでも,あまり整理できてません.
##ゴチャゴチャしてきた気もする...

A:「高速化が目的のマルチスレッド」(≒並列,分散)
#分散ともなるとフォールトトレラント性なども目的になりうる.
#Aにおいても内部では並列性(concurrency)を記述しています.

B:「単に記述を簡単化するためのマルチスレッド」
があって,

通常は上で言うAとBとは,明示的なCPU指定を除いて言語レベルでの
記述とか文法では区別が付きません.どちらも本質的には「並列性を
記述する技術」に他なりません.よって見た目は完全に同じ機能に
見えるようになってます.が,実装や,プログラムを実際に書く段階に
なると,全く別物になることの方が多い.

あと,Aの方は
「明示的な並列性だけでなく,潜在的な並列性をも記述するために使う」
ことが多いのに対し,Bは
「明示的な並列性(のみ)を記述するために使う」
という違いもあるかもしれません.

特にAの方では,並列性を作るために「並列性の低いアルゴリズム」を
「並列性の高いアルゴリズム」に変更する作業が入ることも少なくありません.

○"Javaのマルチスレッド"はA,Bの両方を含む.

○単に"マルチスレッド"と言った場合でも,一応A,Bの両方を含む.
ただし「マルチスレッド」について解説している書籍の大半はBについて
しか説明していない.あくまで言語としてのマルチスレッド機構について
しか説明しておらず,それをどのように使えば効率的かということには
触れていないのが普通.

それは並列プログラミングの本でも調べない限り分からないようになっている.

○"Concurrent Programming in java"はBのみ.
この本は"in java"と書かれており,JavaはA,B両方の機能を持つのに
対し,この本ではBについてしか説明していない.

ただし内部では「共有メモリマシン上でも使える」というような
記述が見られる.

他に
「明示的にCPUに割り当てる機能の有無が,古典的な
  parallelプログラミングとconcurrentプログラムの違いだ」
という趣旨の記述もあった.

そういうわけで,一応並列処理(concurrentやparallel)も含むように
書いているが,その内容はあくまでBにしか対応していない.おそらく
AとBの違いを全然理解していないのが原因.

Bのみのために書かれたプログラムでも,並列マシン上でなら並列実行は
「可能」です.ただし,パフォーマンスが出る保証はまったくない.むしろ
逐次より遅くなる可能性も高い.たしかに並列マシン上でも動くことは動くが,
ただそれだけ.逐次より遅いプログラムは「並列マシン上でも実行できる」
とは普通は言いませんよね.
#だから技術系の文書では"can"とか"can be used to"なんかの出番は
#少ない.Doug Lea本はこれらの表現がウジャウジャ出てくる.

○"Concurrent"はAが主.

少なくとも,英語圏でも以下のような認識はあるようです.
"Concurrent programming involves the notations for expressing potential 
parallelism so that operations may be executed in parallel and the 
techniques for solving the resulting synchronization and communication 
problems. "

たしかに並列に実行されるのは可能性に過ぎません.
しかし潜在的な並列性を記述するのは,並列実行するためです.

「潜在的な並列性」をプログラム記述の中に自然に取り込むことで,その
プログラムを並列マシン上で実行した場合に自動的に並列実行できるように
なる.これが並列性を記述していないプログラムの場合だと,書き直さない
限り並列実行されない.

とはいえ並列性を記述するのは面倒な上に実行速度を低下させます.
だから逐次実行を目的として(潜在的な)並列性を記述することはまずない.

○並列/分散の世界は原則A.

ただし,それに含まれる技術はBを網羅する.
Bが記述できないようでは,Aを実現できたとは言えないから.

次の部分が正にそれ.
>> ここでいうのは「大規模な並列処理機能」ですよね.
>> それがJavaにないというのは(限定的に)YESです.
>> #明示的にRMIとかを使えば書けなくはないだろうが,それをもって
>> #「大規模並列にも対応している」とは普通は言わない.
>> #あくまで「不可能ではない」だけ.
「RMIを使ってゴリゴリ書けば,大規模並列計算も実現できる」
っていうのは,
「Javaには大規模並列計算用の機能はない」
に等しい.

Aで,一般にn個のCPU上で実行するように記述されたプログラムは,当然
1CPU上での実行も「可能」.これは"n==1"にするだけ.

ただし,この1CPU上で動いている並列プログラムは,1CPU上で動いている
逐次プログラムより一般に遅い.よって本当に速度が必要な場合は1CPU上
では並列プログラムではなく逐次専用に作られたプログラムを使うことに
なる.

--------

> Doug Lea本が「高速化技術」の本と思っていなかったです。「高速化技術」に
> ついて期待してDoug Lea本を読んでも期待にそえないと思われます。また、
#期待してたわけじゃないんですけどね.あくまで
#タイトル通りに"Concurrent Programming"の本だと思ったまで.

> Javaのスレッド機構も高速化に主眼はおかれていないと思われます。
「主眼」というわけではないでしょうが,予定のうちです.

少なくともJavaにおいては共有メモリ並列マシン上で高い性能が出せる
ように設計されています.記述性だけでなく高速化技術としてのマルチ
スレッドはJavaの持っている機能の一つなんです.

だいたい,JMMが問題になるのだってそのせいです.

逐次なら一貫性の制約を強くしてプログラムを簡単にすれば十分.
リオーダリングの影響もほとんど無視できる.

だけどそうすると並列マシン上では性能がガタ落ちになる.だからその
トレードオフを考慮して,できるだけプログラムが簡単で,且つ強力な
最適化がかけられる柔軟性も含むメモリモデルが必要になる.
#実際には実質的なメモリモデルの変更を含まずに,より明確に
#定義しなおすことに主眼を置いているらしいけど.

> "Concurrent"は言葉の範囲が広そうなので、高速化技術を前提とするならば
> やはり"Parallel"の言葉を使う方がよいのではないでしょうか?
いや,少なくともその二つはほぼ同義と考えて良いと思います.

"Aside. The terms, concurrent, distributed and parallel have a been used 
at various times to describe various types of concurrent programming. 
Multiple processors and disjoint or shared store are implementation 
concepts and are not important from the programming language point of 
view. What matters is the notation used to indicate concurrent execution, 
communication and synchronization."

> 日本語訳はどちらも「並列」になってしまうのでしょうか? そうだとすると
> 混乱の原因は日本語訳の問題かもしれません。原題のConcurrentについては、
> 並列を高速化技術として取り扱うコミュニティにおいては高速化技術とイコー
> ルの意味を持つかもしれませんが、別なコミュニティにおいてはまた別な意味
> を持つでしょう(「マルチスレッド」の意)。
うーん....

そのコミュニティ内部に限れば,それこそAdaだってVBだって
「オブジェクト指向言語」だと言い張りますよ.

そういう意味でならDoug Lea本もConcurrentなのかもしれませんが,
それはなんか違う.

追加;
たしかに(昔の)OS分野では"Concurrency"もこんな感じにはなるらしい.

ただ,タイトルが"Concurrent Programming in java"ですからね.
当然Javaの持つ機能である「高速化技術としてのマルチスレッド」にも
対応すべきです.そうでないならこんなタイトルは相応しくない.

で,以下のamazon.comの批評に繋がる.

> > 何よりも「並列処理が高速化技術だ」ってことさえも,明示されてなかったのでは?
> これは、「Javaスレッドプログラミング」はConcurrent Programmingを扱うと
> 副題についている。Concurrentという語には、処理をより自然に記述できるマ
副題じゃなくて,原書タイトルは
"Concurrent Programming in Java: Design Principles and Patterns"
なんです.あくまでConcurrent Programmingが主題.

Amazon.comでは,この本は
"Introduction to the Philosophy of concurrent 
    programming, with some Java dressing",
"Phylosophy of concurrency"
だって評価もあった.

> 結局のところ、枯れたイディオムやパターンに頼ることになるのでは。
> 証明できる技術がない以上、経験から得らえた枯れた手法に頼るしかないかと。
つまりは「同期は可能な限りシンプルに」とかああいう話になってしまう.
で,そのような視点がDoug Lea本では丸ごと欠落している.