2016-04-23 14 views
1

私は、__m256iデータ型(インテルイントリンシックスのAVX命令で使用される)のデータを新しい__m256iにコピーすることに興味があります。__m256iデータ型の複製

私はAVXレジスタからのデータをメモリに保存してからメモリからデータを新しいレジスタにロードできることを知っています。しかし、それをメモリに格納してから再びロードする操作を使用せずにレジスタを直接 "複製"できる、より簡単な方法(つまり専用の命令)がありますか?

私は私のレジスタに空のレジスタを追加して、レジスタにロードできる新しい__m256iタイプのバックを得ることができたと思います...これはちょっとしたハックのようですが、ある時点で新しい空の__m256iダミーを作成する操作。

申し訳ありません、簡単な質問です(簡単な問題です)。私のためにこれを行うことができる単一の固有の関数を見つけることができませんでした。

答えて

3

通常の方法で割り当てを行うことができます。

__m256i v1 = _mm256_set1_epi32(42); 
__m256i v2 = v1; 

コンパイラは、一般的にvmovdqa命令を生成します(またはそれだけでも、レジスタのコピーを離れて最適化することができます)。

+0

ああ、どれくらい素晴らしいですか。 Intel Intrinsicsのランディングページでその有用な情報を見つけるのは難しいですが、それは本当に簡単です!私はそれが参照として扱われると思っていたので、同じデータ要素を指していました! – oPolo

+0

はい、おそらく今や目に見えるように思われますが、他の単純なタイプと同様に '__m256i'を扱うことができます。 'int'、多くの基本的な操作が関係している限り。 'int'が汎用スカラレジスタにコンパイラによって割り当てられるように、' __m256i'が 'ymm'レジスタに割り当てられるかもしれません。 –

1

あなたは簡単に、コンパイラは任意の変数の参照を離れて最適化する必要がありMOVDQA

vmovdqa ymm0, ymm1 

本の対応する固有の

_mm256_store_si256(_m256i *p, __m256i a); 

で使用して別のものにx86のアセンブリでYMMレジスタをコピーすることができます。

+0

ありがとうございました。私はインテルのドキュメントを完全に誤解していました。これは役に立ちます! – oPolo

+1

ローカル変数間でデータをコピーするために 'store'組み込み関数を書くことはお勧めできません。 'store' /' storeu'組み込み関数は主に、配列保証をコンパイラに伝えるために存在します。そうでなければ '* p = a;'と書くだけです。 –

関連する問題