21

__m1282 つの値を 1 つに結合したいと思います__m256

このようなもの:

__m128 a = _mm_set_ps(1, 2, 3, 4);
__m128 b = _mm_set_ps(5, 6, 7, 8);

次のようなものに:

__m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 };

これを行うために使用できる組み込み関数はありますか?

4

5 に答える 5

27

これはあなたが望むことをするはずです:

__m128 a = _mm_set_ps(1,2,3,4);
__m128 b = _mm_set_ps(5,6,7,8);

__m256 c = _mm256_castps128_ps256(a);
c = _mm256_insertf128_ps(c,b,1);

順序が希望と逆になっている場合は、を切り替えabください。


本質的に重要なのは_mm256_insertf128_ps、128ビットレジスタを256ビットAVXレジスタの下半分または上半分に挿入できるようにすることです。

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_avx_insertf128_ps.htm

それらの完全なファミリーはここにあります:

于 2012-06-20T09:54:35.863 に答える
2

これでも機能します:

__m128 a = _mm_set_ps(1,2,3,4);
__m128 b = _mm_set_ps(5,6,7,8);

__m256 c = _mm256_insertf128_ps(c,a,0);
c = _mm256_insertf128_ps(c,b,1);

cが初期化されていないため、警告が表示されますが、無視してかまいません。パフォーマンスを探している場合、このソリューションは他のソリューションよりも少ないクロックサイクルを使用します。

于 2012-08-11T01:11:16.533 に答える
2

permute 組み込み関数も使用できます。

__m128 a = _mm_set_ps(1,2,3,4);
__m128 b = _mm_set_ps(5,6,7,8);
__m256 c = _mm256_permute2f128_ps(_mm256_castps128_ps256(a), _mm256_castps128_ps256(b), 0x20);

どちらが速いかわかりません。

于 2015-05-21T22:15:11.540 に答える