ToDo:
SSE2を有効にして ICC 8.1のループ展開やらベクトル化を投入、 さらに32bitの疑似乱数取り出し関数をマクロ化してインライン展開する。
結果、SFMT pluginは爆速です
ベンチマーク結果の SAD Coreは SAD標準の Random[]関数、SADは Random[]関数のプラグイン版(ICCの最適化バージョン)です。
Random[]関数と同じ32bit精度(Random[]関数は実質 31bit精度ですが)なら 周期長 2^19937-1にもかかわらず 166%の実行時間ですんでいます
# Revision: 850 # Compiler: ICC 8.1 # CPU: CoreDuo L3200 # OS: FreeBSD 6.3-PRERELEASE Speed Test of Randum Number Generator Plugins... Batch Size: 1048576 Number of Statistics: 200 Plugin Name SAD Core min= 14.304 typ= 15.517 max= 39.138 sigma= 3.152 nsec/rand SAD min= 6.778 typ= 6.949 max= 7.023 sigma= 0.035 nsec/rand MT19937/53bit min= 59.225 typ= 61.343 max= 65.398 sigma= 2.064 nsec/rand MT19937/32bit min= 32.089 typ= 33.377 max= 34.890 sigma= 0.598 nsec/rand SFMT19937/53bit min= 17.653 typ= 18.737 max= 19.561 sigma= 0.360 nsec/rand SFMT19937/32bit min= 10.235 typ= 10.881 max= 11.560 sigma= 0.259 nsec/rand
実装してみたものの性能が微妙 orz
比較対象は、LinearSolveRealで実装しているLinearSolveComplex1 (MxN 複素行列上の代数を、等価な 2Mx2N 実行列上で計算する) な訳ですが、ある程度の大きさの正方行列の逆行列を計算させた場合
MxN | BLAS | LinearSolveComplex | LinearSolveComplex1 |
128x128 | Netlib | .118 ± .001 sec | .171 ± .001 sec |
256x256 | Netlib | .945 ± .007 sec | 1.449 ± .008 sec |
512x512 | Netlib | 9.623 ± .290 sec | 12.692 ± .103 sec |
1024x1024 | Netlib | 111.400 ± 3.128 sec | 129.272 ± 3.877 sec |
128x128 | GotoBLAS | .085 ± .004 sec | .089 ± .001 sec |
256x256 | GotoBLAS | .648 ± .004 sec | .555 ± .004 sec |
512x512 | GotoBLAS | 6.452 ± .129 sec | 4.438 ± .024 sec |
1024x1024 | GotoBLAS | 84.66 ± .21 sec | 40.71 ± .33 sec |
(Core2 Duo T7200(2GHz))
演算精度は、小行列で試した範囲では、LinearSolveComplexの方が若干良いようです。
原因としては
辺りが疑わしいです
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記