Llanoさんが出そうなので

またレイテンシ測るためだけにマシン買う作業が始まるのか…

まあ、別にやらなくてもよいし、大体結果は予想できるんだが、たまに無性に○○における△△のレイテンシみたいなの測りたくなることがあって、そういう時に実験環境無いとストレスたまるんだよな…そしてストレスが原因で死んでしまうかもしれない。


何故そこまでしてレイテンシを計測せねばならないのか?一応ちゃんとした理由はあるので、以下、我々は何故新しいマシンを買ってまでレイテンシを計測しなければならないか、について説明しようと思う。

  • -

アムダールの法則というのがあって、並列化しても速くならない場合の法則みたいなのがあるのだが、実際には、この法則はなんの意味もないというのは有名な話である(俺の脳内で)。

今のx86だとで、浮動小数8SIMDx2、整数4SIMDx3のスーパースカラで、64以上の並列プロセッサであるわけだが、並列性だけで全てが決まるなら、100並列性くらいあれば大体性能をフルに使いきれそうということになる。100ぐらいの並列性は探せばいくらでもありそうである。memset(a, 0,100)とか書くだけで、100並列は可能なわけで、パフォーマンスのボトルネックのところを調べればその程度の並列性はいくらでもある気がする。

つか、今時のCPUの中のパイプラインて15段ぐらいあるわけだが、それはすなわち、探せばいつでもどっかに15程度の並列性があるという話である。じゃあ、パイプラインみたいな複雑なプロセッサはやめて、もっと簡単なプロセッサを15個並べればいいのではないだろうか。


もちろん、そんなわけはなくて、実際のアプリケーションでは、2つに並列化できれば御の字みたいな問題みたいなのはいくらでもゴロゴロしているのだった。


何が問題か?というと、それがつまり通信レイテンシである。


大体今のCPUだと、コア間通信が1000cycle程度、OSを介すと数万cycle程度ある。memset(a,0,100)は、1cycleの処理が100個あって100cycleぐらいで終わるのだが、これを2コアで並列化すると、数千cycleぐらいになって遅くなるのだった。


数百程度の並列性はどこにでもある、しかし、コア間通信のレイテンシを無視できるほどの大きな処理があるとは限らない。つまり、「並列化して速くなるかどうか」、を決定するのは、「並列性」ではなくて、「並列性の粒度」と「マシン固有の通信レイテンシ」である。「並列性の粒度」は、問題やアルゴリズムで決定されるので、ある特定の問題があった時に、それが並列化して速くなるかどうか、は、「マシン固有のレイテンシ」で決まることになる。つまり、「ある問題が速くできるかどうか」を判断するためには、プロセッサ間の通信レイテンシを把握しておかなければならないというわけだ。


だから、レイテンシを把握しておくのは重要であって、レイテンシを把握しておくために、マシンをIYHしてしまうのは仕方無いと言える。仕方無いと言える。