如何在AVX2中从32位转换为16位未签名的整数
How to convert from 32-bit to 16-bit unsigned integers in AVX2?
i使用 _mm256_cvtps_epi32()
从8 float
s转换为8x32位整数。但是目标是到达16位未签名的整数。我有2个矢量a0
和a1
,每种 __m256i
类型。什么是包装它们的最快方法,以使a0
的16位等效物进入结果的下部128位,而a1
的等效物进入更高的128位?
这是我到目前为止所拥有的,其中p0
和p1
是两个__m256
向量,每个float
s:
const __m256i vShuffle = _mm256_setr_epi8(
0, 1, 4, 5, 8, 9, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 4, 5, 8, 9, 12, 13);
const __m256i a0 = _mm256_cvtps_epi32(p0);
const __m256i a1 = _mm256_cvtps_epi32(p1);
const __m256i b0 = _mm256_shuffle_epi8(a0, vShuffle);
const __m256i b1 = _mm256_shuffle_epi8(a1, vShuffle);
const __m128i c0 = _mm_or_si128(_mm256_extracti128_si256(b0, 0), _mm256_extracti128_si256(b0, 1));
const __m128i c1 = _mm_or_si128(_mm256_extracti128_si256(b1, 0), _mm256_extracti128_si256(b1, 1));
return _mm256_setr_m128i(c0, c1);
我没有测试该代码,但它应该为您提供技巧:
__m256i tmp1 = _mm256_cvtps_epi32(p0);
__m256i tmp2 = _mm256_cvtps_epi32(p1);
tmp1 = _mm256_packus_epi32(tmp1, tmp2);
tmp1 = _mm256_permute4x64_epi64(tmp1, 0xD8);
// _mm256_store_si256 this
相关文章:
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- MongoDB C++ 驱动程序 - 8 位和 16 位整数?
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- 有没有办法让32位C 编译器遵循16位整数促销规则
- 生成伪随机16位整数
- 使用 SSE 内部函数存储四个 16 位整数
- 无法在OpenGL碎片着色器中正确检索16位整数
- 有效地将 16 位整数哈希为 256 位空间
- 从二进制文件 c++ 读取 16 位整数
- 需要一个支持 16 位整数 (c++) 的免费线程安全矩阵数学库
- Qt 5 带有 QOpenGLTexture 和 16 位整数图像
- 将 8 位整数放入 16 位整数数组的最快方法是什么
- 将 RGB 存储在无符号的 16 位整数中
- 将 16 位整数转换为字符数组?(C++)
- 如何使用QByteArray读取16位整数
- 将一个16位整数复制到一个两字节数组
- 如何将16位整数写入文件
- 将typeid().hash_code()存储为16位整数
- 如何从QFile中读取有符号的16位整数