__m128
2 つの値を 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 };
これを行うために使用できる組み込み関数はありますか?
これはあなたが望むことをするはずです:
__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);
順序が希望と逆になっている場合は、を切り替えa
てb
ください。
本質的に重要なのは_mm256_insertf128_ps
、128ビットレジスタを256ビットAVXレジスタの下半分または上半分に挿入できるようにすることです。
それらの完全なファミリーはここにあります:
これでも機能します:
__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が初期化されていないため、警告が表示されますが、無視してかまいません。パフォーマンスを探している場合、このソリューションは他のソリューションよりも少ないクロックサイクルを使用します。
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);
どちらが速いかわかりません。