難しいのはそこではなくて、みたいな話

「猿でもわかるポインタ」のはなし…

ではなくて。

一応ポインタの話もしときますか、本題じゃないけど。「ポインタは難しい」への誤解について。逆なんだよね。ポインタが難しいわきゃない。「指すもの」以上のもんではないんだから。「扱いが」難しいだけの話。ポインタが難しいんではない。

これに似た話。

「並列化」の難しさの話なんだけれど、これってね、当然「全貌として難しい」話満載、ではあるわけな。けれどもね、「数ある難しさの中でも特定のゾーンのトピックだけが強調される」傾向があるよなぁ、と思ってさ。

今 python ML でたまたま並列化の話題になってて、今回改めて思った。

一つが Python (やほかのスクリプト言語) の GIL、もう一つが「同期」ね。これはもちろんそれなりには難しいトピックではあるんだけれども、さすがにこれらの話ばかりに話題が集中するとちょっと黙ってらんなくなる。

ワタシは「同期の難しさ」をごちゃごちゃ言ってるくらいなら「同期すんな」という設計を是が非でも採る。だから結構同期の困難さとは無縁だ。分割されたタスクどうしをどれだけ独立で直交したものに出来るかが勝負の鍵だ。みたいな。

当然スレッドセーフ性は大事なんだけれども、「スレッドセーフでなくてもいい」ようにするのが設計だ、という主張は、まぁあんましわかりやすくはないのかもしんない。「スレッドセーフじゃないので自作せねばならぬ、くらいなら mp 並列」という主張はわかりやすいだろうし目を引くかもしれない。けどそういうことじゃあないんだよね。

そういえば「並列化」の設計の話とプロジェクト管理の話はもちろん通ずるところがあって、要員を倍に増やせば半分の時間で終わる、とならないことが多いのはまさにこの「並列の設計」を誤っているからね。たとえば工場でのベルトコンベアを考える。このベルトコンベア一本に10人配置している場合に20人に増やせば速く作業が進む、と考えるのが「ダメな並列」なのはわかるでしょう。同時にベルトコンベアも倍に増やすか、ベルトコンベアの速度を倍に増やすかしなけりゃ速くなるわけないし、10分割されたタスクならそもそもそこに20人割り当てるのはただの無駄でしょう。並列化の難しさは本当はこのタスク分解設計が普通あまり自明じゃないから、なんだよね。

「普通あまり自明じゃない」と書いたけど、本当はそうでもない、こともある。一般に「データ分割型並列」を採れる場合、並列化はぐっと簡単で、効果もすぐに出やすい。これは「受付窓口を2本に増やす」ことを考えればわかるんじゃないかな。同じタスクをこなす、同じスキルを持った「受付のねーちゃん」ならば、一人より二人で同時にこなせば半分の時間で済むでしょう? このような「入力データの分割」と「タスクの分割」が直結してると考えられる場合の並列は大抵簡単です。簡単な理由は「わかりやすい」ということだけではなくてね。実は「ねーちゃんどうしが連携しなくていい(同期不要)」ということにある。同期が必要なのはこの場合限られてます。例えば使える機械が一つしかなければその機械の取り合いのための同期はいるよね。あるいは、「受付の後ろにいる職員」にパイプラインする必要がある場合は、そこでも同期が必要ね。けれども二人が「別々に別々のお客様をお・も・て・な・す、表茄子」することは互いに独立で直交してるので、ここで同期が必要ということはない。だからこんなとこなら「スレッドセーフ性がないので」なんて議論自体意味がない。

いつも思うんだよね、こういう「確かに難しいんだけれどもそこじゃないよなぁ」みたいなのって、大抵「先天的に説明しずらい」のね。対面であればさっと手描きの絵を描いて説明するんだけどね、あたしの場合。それでも伝わりにくいものがあるのはね、「人間の思考は直線的だから」なのですよ。動物脳に近い部分ほど並列なんだけど、人間脳(大脳新皮質)は「とても遅くてなおかつ直線的」であることが知られています。つまりどんな頭脳明晰な人間でも「並列思考は出来ない」わけ。となれば結局「並列の各々直列部分」に分解して考えるしかないんだけど、これが要するに簡単に迷子の原因になる。「片方考えてるうちにもう片方の処理について忘れてしまう」のねぇ。

「人間は並列思考が出来ないので」に対抗するための道具、なんてのは、コンピュータサイエンス以外からでもいくらでも見つかります。例えば「絵コンテ」ね。これはまさに「並列に発生していることがら」を「直線的に並べ替え」るための道具、だよ。これ実際に職場で皆にやらせたことがあるんだけど、勘のいい子はわかってくれた。人は選ぶかもしれないけど、結構お奨め。

それともう一つが、「スレッドセーフ性について苦労」みたいな情報はどこででも見つかるかもしれないけれど、本当に真の苦労だったのだろうか、という話。熟練するにつれわかってくることだけれども、「確かにその通り、けどその比じゃない苦労してないけ? 別のとこで」なはずよ、ふつう。なにも「スレッドセーフ性だけに苦労」してるわけじゃないし、ほんとにそうならちょっとレベル低いかもしんない。大事だし苦労もするけれど、「思い返せばそれもいい思い出」てなもんでしょ。



Related Posts