ParallelとConcurrentについて少し考えてみる

並列(Parallel)と並行(Concurrent)の違いについて - Togetter


 大学院生のころ、やたらとプログラミング言語やその実行環境について色々調べていた頃があって、そのときもこの辺の扱いが曖昧な感じで説明されていたのでもやっとしていたのだが、当時「なるほど」と思った文章がWebに公開されていた。
 それがこれ。


Java並列プログラミングTips(オリジナルの文章はすでにないようなので、Internet Archiveから取得)


 ここから引用すると、ParallelとConcurrentの違いは以下のようであると説明されている。

  • 逐次(sequential)処理:(比較のため用意した.)ある処理の順番が完全に 一次元で表現できるような処理.シングルスレッド/シングルプロセスの処理 とほぼ等価.並行,又は並列の反対語.あくまでプログラムのレベルにおいて 逐次で記述しているだけで,CPU内部ではパイプライン やスーパースカラ, さらにはVLIW などによって既に 並列実行されているのが普通.
  • 並行処理(ここではこれがParallel):高速化技術の一つで,物理的にCPU が二つ以上あり,スレッドやプロセス等が時間的に同時に動作しているが,そ れらの間の通信や相互作用が粗なもの.
  • 並列処理(こちらがConcurrent):並行とほぼ同じで高速化技術の一 つだが,通信や相互作用が密な物.並行と並列とでは本質的な差はほとんどな く,明確な区別無しに使われている場合も多いと思う.(どちらの用語を使う か悩んだ時は,「並列コンピュータ」では"parallel computer", 「並列プログラミング」では"concurrent programming"を使うこと をお勧めする.)
Java並列プログラミングTips


 つまり上記の内容だと、Parallelは同時実行しているプロセス・スレッドなどが互いに影響を及ぼすことが少ないConcurrentは同時実行しているプロセス・スレッドが互いに競合するメモリがあったり、相互作用があったりするということになる。ただし、本文中に「程度問題」と書かれているので、これを書かれた方は最終的にはあまり区別はないと考えているようだ。
 もう一点、この資料では並行と並列がTogetterでの話と逆になっているので注意。ただ上記の資料はとても面白いので、読んでおくのが吉。とても為になります。



 次にこちら。



ConcurrentとParallel - 川西 裕幸のブログ - Site Home - MSDN Blogs


 Microsoftでは以下のような定義であるらしい。

PDC 08のスライドによると、Concurrentは独立した要求を同時に実行することで、Parallel(あるいはParallelism)は一つのタスクを複数に分解D(Decompose)してConcurrentに実行できるようにすることとなっています。MSDNのParallel関連のドキュメントの日本語訳にはConcurrentに「同時実行」が当てられています。

ConcurrentとParallel - 川西 裕幸のブログ - Site Home - MSDN Blogs


 なんだか文章からすると先ほどの内容とは逆の印象を受けますねえ。ちなみに英WikipediaのParallel Computingの解説を見ると、なんとなくMicrosoftのParallelのイメージに近い気がします。

Parallel computing is a form of computation in which many calculations are carried out simultaneously,[1] operating on the principle that large problems can often be divided into smaller ones, which are then solved concurrently ("in parallel").

Parallel computing - Wikipedia, the free encyclopedia


 とまあ、少しばかり調べたけどここらあたりで挫折。明確な定義は特に見つからず。自分のイメージだとparallel と concurrent 、並列と並行の覚え方 - まめめものイメージがぴったり合うんだけどねぇ。


Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―


分散システム 第二版

分散システム 第二版

  • 作者: アンドリュー・S・タネンバウム,マールティン・ファン・スティーン,Andrew S. Tanenbaum,Maarten van Steen,水野忠則,佐藤文明,鈴木健二,竹中友哉,西山智,峰野博史,宮西洋太郎
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2009/01/01
  • メディア: 単行本
  • 購入: 2人 クリック: 29回
  • この商品を含むブログ (13件) を見る

The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで

The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで

Clean Codeを読了

Clean Code アジャイルソフトウェア達人の技

Clean Code アジャイルソフトウェア達人の技


 若干時間がかかったが、本日読了。
 ただこの本は読みっぱなしにするのではなく、たびたび手にとって読んで頭をすっきりさせるものだと思う。


 筆者にとっての、「Clean Code」とは何か? がみっちりと書かれているけど、一番ためになるのは14章以降。ソースをクリーンにしていく手順が、一つ一つ丁寧に記述されていて、「TDDとかわかんないよ! ぷんぷんっ!」な人にもソースを改善していくにはどう考えるのか・どのような手順を踏んでいくのかが分かりやすいはず。裏を返せば、ソースをクリーンにする魔法はないんだ、と読み取れ、自分の胸にえらく突き刺さっていきました。


 もちろん他の章も肝に銘じておきたいものが多い。そしてやっぱり「コードを書く」というのが重要なんだ、というのが身にしみた。読んでいたのが丁度開発に入って、コードを書いている途中だったからね。散々活用させていただきました。


 ということで、ソースコード書くときに迷ったらこれを読もう。

Ruby/Rails勉強会@関西に行ってきた

日本Rubyの会 公式Wiki - 第27回 Ruby/Rails勉強会@関西

またもや10分ほど遅刻……京都女子大付近って結構ややこしいのね。以下にざっと書いていこう。

関数型言語 Ruby by keisuken さん

遅れていった上に、その時点で会場の無線LANが使用できないということに気付かなかったためいろいろとやっているせいで全然説明が頭に入っておりませんでした><
とはいえ資料を見ると面白いです。あーちゃんと説明を聞いておきたかった。


ここで休憩。それと同時に無線LANがつながり、夏ライオンを立ち上げてTwitterに接続。ついでにkeisukenさんにご挨拶などしてみたり。id:deflisがOSC08北海道ustをやってたのでつなげてみたり。

日本 Ruby 会議 2008 参加報告 by いまいさん

  1. Diversity
  2. addordance
  3. Regional

この3つの題目で話が展開していきました。Ruby実装もいろいろ増えたものですね。

サイロスさんのRubykaigiのうた&ミクタイムキーパー裏話が面白い…会場ではならなかったので、懇親会にて聞かせていただきました。ミクかわいいよミク。

http://jp.rubyist.net/RubyKaigi2008/?Goodies

Ruby 初級者向けレッスン 第 21 回 by okkez さん

自分はDグループだったので場所移動。Ruby自体慣れてないのと、Carbon Emacsがなぜかエラーをはいてソースを保存させてくれなかったので1問ぐらいしか出来ず…これはいけません。プログラミング力が落ちています。

というわけで自分のコードを晒しておく。今回使った情報は配布されたテキストとリファレンスマニュアルのみでとりあえず実現したもの。もっとRubyらしさのあるコードにできるはず。

# -*- coding: utf-8 -*-

class Shain 
  attr_writer :kihonkyu
  def standup
  end
  
  def kyuryo()
  end

  def bonus
    kyuryo * 4
  end
end

class Tanto < Shain
  def standup
    p '担当は普通に起立しました'
  end

  def kyuryo()
    @kihonkyu
  end
end

class Shunin < Shain
  def standup
    p '主任は素早くたちました'
  end
  
  def kyuryo()
    @kihonkyu * 2
  end
end

class Bucho < Shain
  def standup
    p '部長がだるそうにたちました'
  end
  	
  def kyuryo()
    @kihonkyu * 3
  end
end

class Torishimariyaku < Shain
  def standup
    p '取締役は(ry'
  end

  def kyuryo()
    @kihonkyu * 4
  end
end


if __FILE__ == $0 and ARGV.size > 0
  case ARGV.shift
  when 'Tanto' 
    shain = Tanto.new
  when 'Shunin'
    shain = Shunin.new
  when 'Bucho'
    shain = Bucho.new
  when 'Torishimariyaku'
    shain = Torishimariyaku.new
  end	
  
  shain.standup()
  shain.kihonkyu = ARGV[0].to_i
  p shain.kyuryo()
  p shain.bonus()
end

オープンソースとビジネスの実際 by かずひこさん

心にグサッときた発表。「ふつうじゃないプログラミング」の一例としてMercurailの件は記憶に新しいところ(でも既に3年も前ということに驚きを隠せえない)。
はたして私の手には「コード」が残るのだろうか……そしてPythonなのかRubyなのか、それが問題だ。

とにかくプロプラエタリは2歳まで!

懇親会

私の座ったあたりには大学関係者(学生さんとか勤めてる人とか)が多かったですねー(id:Sixeightさんとか)。思わずぐいぐい飲んでしまって非常に楽しい酒でした。



それにしても女性率が高い。これが健全ということなんですね、わかります。

Mercurialでバージョン管理できねーよ! Pythonの罠?

明日中間発表だというのに、何してるんだか……とか思いつつ。

ここ最近悩んでいたのがMercurialでCommitが出来なくなってました。普通に


>>$ hg init
>>$ hg add

と、ここまではうまく行くのですが、


>>$ hg commit -m "init"
abort: unknown encoding: X-MAC-JAPANESE, please check your locale settings
transaction abort!
rollback completed

となってAbortしてしまいます。んでもっていわれた通りロケール周りを調べてみたわけですが、

>>$ locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL="ja_JP.UTF-8"

とまあ、こんな感じ。ということはPythonのほうに何か鍵が隠されているのかといろいろとググったりして調べてみると、どうも locale.getpreferredencoding() が臭い。試しにインタプリタ上で呼び出してみるとX-MAC-JAPANESEの文字列が。
Mercurialのソースを除いてみるとmercurial/util.pyでlocale.getpreferredencoding()を呼び出しているのを発見。しかもどうみてもエンコーディング関係。いつからlocale.getpreferredencoding()を呼び出すようになったかを見るとVersion0.9.2から変わってますね。道理で。とりあえず、HGENCODINGを.bashrcでUTF-8に設定してターミナルを再立ち上げすると今度は無事にコミットされたみたいです。

MacOSX上でのPostgreSQLでinitdbがうまくいかない

一応解決したので書いておく。

MacportsからPostgreSQL8.1.5を入れたんだけど、initdbを動かすと途中でエラーが起こる。
メッセージを読んでみるとどうもshared_memoryがつくれないみたいなことを言ってる。
色々ググって見ると、ここの方も同じようなエラーが。同じく/etc/sysctl.confを書いてみてもダメ。

さらにググって見ると、

Article 18924 at 06/04/05 07:39:11 From: sdr0x07b6@mac.com Subject: [macosx-jp:18924] Mac OS X 10.4.6アップデートにてPostgreSQL起動失敗

というのを発見。元のドキュメントとSHMMAXの値とかが違うなーとか思いつつ、色々探っていくと

Re: SHMMAX seems entirely broken in OS X 10.4.2

10.4.2のときから何か問題があったのか。とりあえずここの設定を元にしたらinitdbが最後まで動いてくれました。

PostgreSQL: Documentation: Manuals: PostgreSQL 7.4: Server Run-time Environment
PostgreSQL: Documentation: Manuals: PostgreSQL 8.1: Managing Kernel Resources


MacOS X

In OS X 10.2 and earlier, edit the file /System/Library/StartupItems/SystemTuning/SystemTuning and change the values in the following commands:

sysctl -w kern.sysv.shmmax
sysctl -w kern.sysv.shmmin
sysctl -w kern.sysv.shmmni
sysctl -w kern.sysv.shmseg
sysctl -w kern.sysv.shmall

In OS X 10.3 and later, these commands have been moved to /etc/rc and must be edited there. Note that /etc/rc is usually overwritten by OS X updates (such as 10.3.6 to 10.3.7) so you should expect to have to redo your editing after each update.

In OS X 10.3.9 and later, instead of editing /etc/rc you may create a file named /etc/sysctl.conf, containing variable assignments such as

kern.sysv.shmmax=4194304
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.sysv.shmall=1024
This method is better than editing /etc/rc because your changes will be preserved across system updates. Note that all five shared-memory parameters must be set in /etc/sysctl.conf, else the values will be ignored.

Beware that recent releases of OS X ignore attempts to set SHMMAX to a value that isn't an exact multiple of 4096.

SHMALL is measured in 4 kB pages on this platform.

In all OS X versions, you'll need to reboot to make changes in the shared memory parameters take effect.
PostgreSQL: Documentation: Manuals

コメント付きのドキュメントのほうにもMacOSX関係で書いてありますね。とりあえず本文に書かれている記述と実態が食い違ってるぽい。