2012年1月13日金曜日

グラフサイズの概算

疎行列をCSRで持つとすると、AAとJCが非ゼロ要素数nz個分、
IAとV1,V2が行列の一辺の長さn個分の格納領域が必要となる。
単精度の場合、全ての配列は長さ*4Byteになるので、8nz+12n Byteになる。

nとnzはエッジファクタefを用いるとnz=n*efとなる。
だいたいefは16程度で生成するらしいので、これを適用すると140n Byte!!
倍精度だと、AAとV1,V2が2倍に増えるので、12nz+20n Byte = 212n Byteだ。


今回ターゲットとするメモリ必要量は、3~6GBには収まらず128~256GBよりは小さい領域。
よって、nは2^26~2^30程度の領域を相手にすればよいようだ。メモリ量は8.75GBから140GB程度。

n=2^26(scale s=26)だと、ベクトル1本が256MBで、どうにか扱えそうな感じだ。
n=2^30(scale s=30)だと4GBになるので、現状のFermiでも扱うのは不可能になる。
s=26のときAAとJCはそれぞれ16*2^26で、4GBになる。s=30では64GB。
s=26だとFermiのC2070なら全てメモリに乗ってしまうのであまり面白くなさそう。
ただし、現状のハードと実装ではBlock=2^15, Thread=2^10で合計2^25がベクトル長の最大になる。
ベクトルの分割を実装するのはちょっと面倒だが、s=25では行列分割の必要性がなく何かぱっとしない。

Pregelなどの評価ではef=128くらいらしいので、この場合も考えておく。
これを適用すると、メモリ量は8nz+12n = 1036n Byteで、scaleは23~28で、メモリ量は8.09GB~259GB。
ベクトルの容量はscaleでのみ決まるのでs=23なら8MB、s=26は変わらず256MB、s=28で1GB。
AAやJCはefの影響も受け、s=23で1GB、s=26で8GB、s=28だと32GBになる。
これくらい大きいと行列の分割の必要性、正当性も大いに主張できるし、ちょうどいいとは思う。

1 件のコメント: