2013-06-13 9 views
6

256ビット相当もし固有_mm_load1_ps(と__m128のすべての4つのスロットにメモリから単一のフロートをロードすることができる)AVX SSEと_mm_load1_ps

AVX 256ビット幅のSIMDを使用する場合、があるように思わ_mm256_load1_ps()は、メモリから単一のfloatをベクトルの8つのスロットすべてにロードするためのものではありません。

なぜこの省略がありますか?これを回避するにはどうすればよいですか?

さらに良い点は、ベクトルの対象スロット0..7に1つの浮動小数点数をロードする方法ですか?

+0

AVXとAVX2では、まだ128( 'PINSRD' /' INSERTPS':要素番号=コンパイル時定数)に要素を挿入することしかできません。 upper128をゼロにしないでこれを行うことは、非VEXエンコーディングでのみ可能で、インテルのpre-SkylakeでVEXと非VEX命令を混在させることが大幅に減速します。 f128、insertps、insertf128を抽出することができます。 –

+0

'_mm_load1_ps'は' movss' + shuffleがfloatをブロードキャストする複合組み込み関数です。コンパイラにレジスタに定数を渡したいと思ったことを何でもしてもらいたいなら、 '_mm256_set1_ps(* f)'が良い選択です。スマートコンパイラは必要に応じて 'VBROADCASTSS'を発行します。 –

答えて

9

_mm256_broadcast_ssはあなたが探しているものです。

+0

私は何かを誤解しているかもしれませんが、なぜ_mm256_set1_ps(* x)をしないのですか? http://stackoverflow.com/questions/13218391/is-mm-broadcast-ss-fan-than-mm-set1-ps –

+2

_mm256_set1_ps(* x)も同様に動作しますが、複数の命令を生成することができます。 _mm256_broadcast_ssは1命令だけを生成することが保証されています、VBROADCASTSS –

関連する問題