如何从 __m256i AVX2 寄存器中提取一个字节到另一个 __m256i 寄存器中?
How can I extract a byte from __m256i AVX2 register into another __m256i register?
给定一个 __m256i 寄存器和一个索引 i,我想从寄存器中存储的每个值中提取一个字节并将其保存在另一个 __m256i 寄存器中。同样在对第二个寄存器执行一些计算之后,我想在不触及其他字节的情况下将字节加载回第一个寄存器。
Example:
index i = 2
__m256i a:
3210
|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|
__m256i b:
|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|
// some calculation
__m256i a:
|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|
很抱歉,如果之前有人问过这个问题,但由于我是这个话题的新手,所以很难找到这个话题的答案。谢谢!
我试着概括上面的答案:
const int index = 2; // byte index
__m256i mask = _mm256_set1_epi32(0xFF << index*8); // bit mask |0F00|0F00|...|0F00|
__m256i a; // source vector |AAAA|AAAA|...|AAAA|
__m256i b = _mm256_blendv_epi8(_mm256_set1_epi8(-1), a, mask);// extract byte |FAFF|FAFF|...|FAFF|
b; // after some manipulations |BBBB|BBBB|...|BBBB|
a = _mm256_blendv_epi8(a, b, mask); // store byte |ABAA|ABAA|...|ABAA|
给定一个 __m256i 寄存器和一个索引 i,我想从寄存器中存储的每个值中提取一个字节并将其保存在另一个 __m256i 寄存器中。同样在对第二个寄存器执行一些计算之后,我想在不触及其他字节的情况下将字节加载回第一个寄存器。
Example:
index i = 2
__m256i a:
3210
|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|
__m256i b:
|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|
// some calculation
__m256i a:
|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|
很抱歉,如果之前有人问过这个问题,但由于我是这个话题的新手,所以很难找到这个话题的答案。谢谢!
我试着概括上面的答案:
const int index = 2; // byte index
__m256i mask = _mm256_set1_epi32(0xFF << index*8); // bit mask |0F00|0F00|...|0F00|
__m256i a; // source vector |AAAA|AAAA|...|AAAA|
__m256i b = _mm256_blendv_epi8(_mm256_set1_epi8(-1), a, mask);// extract byte |FAFF|FAFF|...|FAFF|
b; // after some manipulations |BBBB|BBBB|...|BBBB|
a = _mm256_blendv_epi8(a, b, mask); // store byte |ABAA|ABAA|...|ABAA|