128bit-AVXをイントリンシック命令で使う
AVXは256bit演算(浮動小数点演算がメイン)で有名だけど、整数演算的には128bitAVXというのもあって、これまでのSSE系命令を3オペランドで記述できるので、少し高速化が期待できる…はず。
で、アセンブラは暗号にしか見えないので置いといて、イントリンシック命令から128bitAVXが使えるのか、そいで使えるなら効果はどれくらいなのかを試してみた。
結論から言うと、イントリンシック命令で書いてある場合、VC++2010のコンパイルオプションに/arch:AVXと書いてコンパイルし直すだけで128bitAVXを使ってくれる。(逆アセンブルから確認、AVXっぽい命令が出てた)
ちなみにVC++2008で同じ事やると"/arch:AVX"なんてコマンド知らんって怒られる。
さて、x264guiExの色変換の関数だけ切り出してVC++2010で速度測定用のプログラムを作って速度を比較してみた。
Core i5 2500 @ 3.8GHzで、1920x1080pを1フレーム変換するのにかかる時間を測った。(120フレームを変換するのを100回やってその平均をとる)
YUY2 → nv12
C言語 1.296ms
SSE2 0.488ms
+AVX 0.476ms (SSE2版比 +2.4% 高速化)
YC48 → nv12 (10bit)
C言語 4.178ms
SSE2 2.379ms
SSE4.1 1.346ms
+AVX 1.210ms (SSE4.1版比 +11.3% 高速化)
というわけで/arch:AVXでコンパイルすれば、128bitAVXを(まったく書きなおしていない)イントリンシック命令で使用出来て、少し効果があるっぽい、ということがわかった。
というかYC48→nv12のSSE2版あんま速くない…まあ適当だからしょうがないか…
で、アセンブラは暗号にしか見えないので置いといて、イントリンシック命令から128bitAVXが使えるのか、そいで使えるなら効果はどれくらいなのかを試してみた。
結論から言うと、イントリンシック命令で書いてある場合、VC++2010のコンパイルオプションに/arch:AVXと書いてコンパイルし直すだけで128bitAVXを使ってくれる。(逆アセンブルから確認、AVXっぽい命令が出てた)
ちなみにVC++2008で同じ事やると"/arch:AVX"なんてコマンド知らんって怒られる。
さて、x264guiExの色変換の関数だけ切り出してVC++2010で速度測定用のプログラムを作って速度を比較してみた。
Core i5 2500 @ 3.8GHzで、1920x1080pを1フレーム変換するのにかかる時間を測った。(120フレームを変換するのを100回やってその平均をとる)
YUY2 → nv12
C言語 1.296ms
SSE2 0.488ms
+AVX 0.476ms (SSE2版比 +2.4% 高速化)
YC48 → nv12 (10bit)
C言語 4.178ms
SSE2 2.379ms
SSE4.1 1.346ms
+AVX 1.210ms (SSE4.1版比 +11.3% 高速化)
というわけで/arch:AVXでコンパイルすれば、128bitAVXを(まったく書きなおしていない)イントリンシック命令で使用出来て、少し効果があるっぽい、ということがわかった。
というかYC48→nv12のSSE2版あんま速くない…まあ適当だからしょうがないか…
スポンサーサイト