→ついでにバンディングを直そう
→あれ?dfttestのdither1だけじゃ足りなくね?
→dither2以上か・・・これってMersenne Twisterっていうよくわからんアルゴリズム使ってるんだよね・・・
→最近はSIMD化されたの(SFMT/dSFMT)があるらしいぞ
→開発者は日本人なのに日本語の関数説明ページがない・・・
→float精度で良いなら従来の方が軽いような?
→ループで呼ぶからダメらしいので、大量に生成してみたけど結局従来とあまり変わらないような?
というところで、元に戻しました。
使い方に依るのかもしれません
181216追記
→dffttestは最近16bit深度に対応した1.9.4.3があるらしい
→AVXで一部最適化されてるぞ
→その他もAVX化したら早くならんかね
→なんか速くなる時とSSEより遅くなる時とあるな・・・
→メモリアクセスがネックの場合、alignは大事なんですね
→使う関数はdither以外はあらかたAVX化したし、もうこれぐらいが限界かな
→でもやっぱりdither処理が一番コスト高い・・・こいつ(Floyd-Steinberg)をSIMD化したコードはないものか・・・
→ってかMersenneTwisterとFloyd-Steinbergを両方呼ぶ必要ってあるのかな・・・
という疑心暗鬼な今日この頃。
一応だんだん速くなってきていますが、結局MTが一番効く気がします。
↓今のdfttest.dll(fftwは除く)の各関数処理時間
(1000フレーム処理時・サンプル単位はms なのでサンプル数/1000で[ms/フレーム]になります)
dither=2,opt=0,threads=1,align=64/AVX | ||
名前 | 排他サンプル数 | 排他サンプル % |
+ dfttest.dll | 16,100 | 27.52% |
| - dither_C_sub | 9,739 | 16.65% |
| - filter_0_AVX | 1,300 | 2.22% |
| - MTRand::reload | 1,253 | 2.14% |
| - proc1_AVX | 1,026 | 1.75% |
| - proc0_AVX | 887 | 1.52% |
| - removeMean_AVX | 859 | 1.47% |
| - addMean_AVX | 344 | 0.59% |
| - memcpy | 271 | 0.46% |
| - memset | 250 | 0.43% |
| - func_0 | 113 | 0.19% |
とやっていたら、一部の関数にAVX2の命令(_mm256_cvtepu8_epi32:鯖のSandyBridgeでは使えない)を使っていた・・・orz
→というのを直してもまだ動かず。
なんで?と思ってたら、浮動小数のFMAもHaswell以降だったんですね・・・。
Haswellで、AVX2:整数、FMA:浮動小数が追加されたということ?わからん。
0 件のコメント:
コメントを投稿