トップ «前の日記(2006-12-04) 最新 次の日記(2007-01-13)» 編集

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2007-01-09 [長年日記]

_ [tDiary] tDiary 2.0.4

上げたと思ったらまたすぐに脆弱性対応で上がってましたか。 そのうち入れよう。

_ [プロセッサ] map と reduce?

単にmapとreduceを加えれば良いのでは?と思ってしまった。 mapとreduceと後はsortのような配列演算ライブラリを整備するだけで、並列化可能な部分の99%は自動的に並列化される。Rubyでも簡単に対応できる。あとはiteratorにvariantかpragmaを入れて評価順を不定にし、破壊的変更を不可にするのを加えると良いかも。

map はともかく reduce は適用する関数が交換可能であるとき、 つまり順不同に適用しても同じ結果が得られることが保証できる場合でないと並列化は出来ないですよね。

# たとえば list.reduce( fun(x y){x-y} ) (構文適当) だとうまくいかない。

あと、そういうのとは次元の違う話として、 「並列化が出来る」ことと「並列化して速くなる(結果が早く得られる)」ことは別の次元の話だということに注意が必要。

list.map( fun(x){x+1} ) なんて単純なものを並列ジョブにすると その並列化のコストの方が割高になることがほとんどだろう (リストの分割結合とプロセッサコア間通信コストを考えただけでも)。 もっとも、巨大リストが操作対象のときは、 リストを数個に分割してやれば速くなるだろうから、 いつどういう並列化をするのかトレードオフの話である。 逆に関数が重ければ、 listの要素が数個であっても分割する価値があることもあるだろう。

# つまり実行時に動的分配する位の芸当は出来ないと意味をなさない

だが、現状はこの程度の事も、専用コンピュータを使うか、 OpenMP, MPI のような並列化ライブラリを駆使するか、 自動並列化コンパイラに頼るにしても手軽にはまともな性能はでない。

  • (脱線)

自動並列コンパイラは(C,Fortran あたりなら)既にあります。 そういう用途が少ないのでプロ向けにしか出回ってませんが 最近は Intel も Core 路線で icc コンパイラが 対応してきているみたいですね。

逆にいうと、map だけが唯一並列化する手段でもなくて、 イテレータであっても順序依存性を勝手に判断して 並列化をコンパイラがやってくれる、というのも、 既に現実の世界。

# その道のプロはあまり使わないだろうけれど

  • (さらに脱線)

現状ではプロセッサコア(CPU) と OS の組み合わせによる並列化は、 専用ライブラリや専用ハードを除けば プロセス並列/スレッド並列くらいしか現実味がない。

専門家が使うのならともかく、一般民が使える並列環境ともなると、 タスクスイッチや処理中断程度は普通に耐えるような OS 環境でないと 使ってもらえない。

つまり多重並列している最中にタスクスイッチして全並列情報を 退避させることは普通にできないと困るわけで、 今のところスレッド並列(と同等レベルの事)までしか出来なさげ。 それより細かいと一気にハードウェアレベルに落ちて アウトオブオーダ実行とかになってしまう。

  • (それはさておき)

話がそれすぎてわけが分からなくなったので今日はここまで。

_ [雑記] trackback

受け付けられるようにしておいた方がいいのかねぇ。 SPAM 恐いんだけど (コメントSPAM もそうだが)...