2018/12/09

MT

MT化で早くなるぜ!
→ついでにバンディングを直そう
→あれ?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 件のコメント:

コメントを投稿