simd相关内容

将 __m256i 存储为整数

如何将 __m256i 数据类型存储为整数? 我知道对于花车有: _mm256_store_ps(float *a, __m256 b) 其中第一个参数是输出数组. 对于我只找到的整数: _mm256_store_si256(__m256i *a, __m256i b) 其中两个参数都是 __m256i 数据类型. 做这样的事情就足够了: int * X = (int* ..
发布时间:2022-01-06 13:07:28 其他开发

SSE2 内在函数 - 比较无符号整数

我有兴趣在添加无符号 8 位整数时识别溢出值,并将结果限制为 0xFF: __m128i m1 = _mm_loadu_si128(/* 16 个 8 位无符号整数 */);__m128i m2 = _mm_loadu_si128(/* 16 个 8 位无符号整数 */);__m128i m3 = _mm_adds_epu8(m1, m2); 我有兴趣对“小于"进行比较在这些无符号整数上,类似 ..
发布时间:2022-01-06 13:04:10 C/C++开发

MOVDQA 和 MOVAPS x86 指令之间的区别?

我正在查看英特尔数据表:英特尔® 64 和 IA-32 架构Software Developer's Manual 和我找不到 之间的区别 MOVDQA:移动对齐双四字 MOVAPS:移动对齐打包单精度 在英特尔数据表中,我可以找到这两个指令: 此指令可用于从 128 位内存位置,将 XMM 寄存器的内容存储到128 位内存位置,或在两个 XMM 寄存器之间移动数据. 唯一 ..
发布时间:2022-01-06 13:01:12 其他开发

Intel x86 SSE SIMD 指令入门

我想详细了解如何使用 SSE. 除了显而易见的阅读英特尔® 64 和 IA-32 之外,还有哪些学习方法架构软件开发人员手册? 主要我有兴趣使用 GCC X86 内置函数. 解决方案 首先,我不建议使用内置函数 - 它们不可移植(跨同一架构的编译器). 使用 intrinsics、GCC 做得很好 将 SSE 内在函数优化为更优化的代码.您可以随时查看程序集,了解如何充分 ..
发布时间:2022-01-06 12:59:45 其他开发

我可以使用 AVX FMA 单元进行位精确 52 位整数乘法吗?

AXV2 没有任何大于 32 位源的整数乘法.它确实提供 32 x 32 -> 32 乘法,以及 32 x 32 -> 64 乘以1,但没有 64 位来源. 假设我需要一个输入大于 32 位但小于或等于 52 位的无符号乘法 - 我可以简单地使用浮点数 DP 乘法 或 FMA 指令,当整数输入和结果可以用 52 位或更少位表示时(即在范围内),输出是否为位精确[0, 2^52-1])? ..
发布时间:2022-01-06 12:54:49 其他开发

使用 AVX 指令进行水平向量求和的最快方法

我有一个包含四个 64 位浮点值的压缩向量. 我想得到向量元素的总和. 使用 SSE(并使用 32 位浮点数),我可以执行以下操作: v_sum = _mm_hadd_ps(v_sum, v_sum);v_sum = _mm_hadd_ps(v_sum, v_sum); 不幸的是,尽管 AVX 具有 _mm256_hadd_pd 指令,但它的结果与 SSE 版本不同.我相信这是因为大多 ..
发布时间:2022-01-06 12:54:15 其他开发

4 个 32 位整数的 SSE 乘法

如何将 4 个 32 位整数乘以另外 4 个整数?我没有找到任何可以做到这一点的说明. 解决方案 如果您需要 signed 32x32 位整数乘法,则在 software.intel.com 看起来它应该做你想做的: 静态内联 __m128i muly(const __m128i &a, const __m128i &b){__m128i tmp1 = _mm_mul_epu32(a,b ..
发布时间:2022-01-06 12:53:32 其他开发

在 Intel 上使用 SSE2 减少无符号字节的总和而不会溢出

我试图在 Intel i3 处理器上找到 32 个元素(每个 1 字节数据)的总和减少.我是这样做的: s=0;对于 (i=0; i 但是,它需要更多时间,因为我的应用程序是一个需要更少时间的实时应用程序.请注意,最终和可能超过 255. 有没有办法使用低级 SIMD SSE2 指令来实现这一点?不幸的是,我从未使用过 SSE.为此,我尝试搜索 sse2 函数,但它也不可用.是否(sse ..
发布时间:2022-01-06 12:49:37 其他开发

将 32 位解包为 32 字节 SIMD 向量的最快方法

将 32 位存储在内存中的 uint32_t 中,将每一位解包到 AVX 寄存器的单独字节元素的最快方法是什么?这些位可以位于各自字节内的任何位置. 编辑:澄清一下,我的意思是位 0 到字节 0,位 1 到字节 1.显然字节中的所有其他位都为零.目前我能做的最好的是 2 PSHUFB 并且每个位置都有一个掩码寄存器. 如果uint32_t是位图,那么对应的向量元素应该是0或非0.(也就 ..
发布时间:2022-01-06 12:47:06 其他开发

x86 SIMD 内在函数的头文件

哪些头文件为不同的 x86 SIMD 指令集扩展(MMX、SSE、AVX 等)提供了内在函数?在网上找不到这样的列表似乎是不可能的.如果我错了,请纠正我. 解决方案 现在你通常应该只包含 .它包括一切. GCC 和 clang 将阻止您将内部函数用于编译时未启用的指令(例如使用 -march=native 或 -mavx2 -mbmi2 -mpopcnt -mfma -mcx16-m ..
发布时间:2022-01-06 12:37:14 其他开发

使用 AVX 最快实现指数函数

我正在寻找在 AVX 元素(单精度浮点)上运行的指数函数的有效(快速)近似.即 - __m256 _mm256_exp_ps( __m256 x ) 没有 SVML. 相对准确度应该类似于 ~1e-6 或 ~20 个尾数位(2^20 中的 1 部分). 如果它是用英特尔内在函数以 C 风格编写的,我会很高兴. 代码应该是可移植的(Windows、macOS、Linux、MSVC、IC ..
发布时间:2022-01-06 12:36:09 其他开发

如何使用 x86 SIMD 有效地将 8 位位图转换为 0/1 整数数组

我想将 8 位整数转换为大小为 8 的数组,每个值都包含一个整数的位值. 例如:我有 int8_t x = 8; 我想把它转换成 int8_t array_x = {0,0,0,0,1,0,0,0}; 这必须有效地完成,因为此计算是信号处理块的一部分.有没有一种有效的方法来做到这一点?我确实检查了混合说明.当数组元素大小为 8 位时,它不符合我的要求.开发平台为AMD Ryzen. ..
发布时间:2022-01-06 12:32:10 其他开发

如何执行_mm256_movemask_epi8 (VPMOVMSKB) 的逆运算?

内在: int 掩码 = _mm256_movemask_epi8(__m256i s1) 创建一个掩码,其32 位对应于s1 的每个字节的最高有效位.使用位操作(例如BMI2)操作掩码后,我想执行_mm256_movemask_epi8 的逆操作,即创建一个__m256i 向量每个字节的最高有效位包含 uint32_t 掩码 的相应位. 最好的方法是什么? 编辑:我需要执行相反的 ..
发布时间:2022-01-06 12:27:45 其他开发

如何使用 SIMD 实现 atoi?

我想尝试使用 SIMD 指令编写 atoi 实现,以包含在 RapidJSON(C++ JSON读/写库).它目前在其他地方有一些 SSE2 和 SSE4.2 优化. 如果是速度增益,多个atoi结果可以并行完成.字符串最初来自 JSON 数据缓冲区,因此多 atoi 函数必须执行任何所需的 swizzling. 我想出的算法如下: 我可以用以下方式初始化一个长度为 N 的向量: ..
发布时间:2022-01-06 12:21:17 C/C++开发

快速 24 位数组 ->32位数组转换?

快速总结: 我有一个 24 位值的数组.关于如何将单个 24 位数组元素快速扩展为 32 位元素的任何建议? 详细信息: 我正在使用 DirectX 10 中的像素着色器实时处理传入的视频帧.一个绊脚石是我的帧来自具有 24 位像素(YUV 或 RGB 图像)的捕获硬件,但 DX10 需要32 位像素纹理.因此,我必须将 24 位值扩展为 32 位,然后才能将它们加载到 GPU ..
发布时间:2022-01-06 11:37:52 其他开发

如何在 Linux 上根据 CPU 能力进行运行时绑定

是否可以让 linux 库(例如“libloader.so")加载另一个库来解析任何外部符号? 我有一大堆代码有条件地编译以支持 SIMD 级别(SSE2、AVX、AVX2).如果构建平台与运行时平台相同,这将正常工作.但它阻碍了跨代处理器的重用. 一个想法是让 executable 调用 function 链接到不直接实现 function 的 libloader.so>.相反,它从 ..
发布时间:2022-01-04 15:42:19 服务器开发

如何加速这个 LUT 查找的直方图?

首先,我有一个数组int a[1000][1000].所有这些整数都在 0 到 32767 之间,它们是已知常量:它们在程序运行期间永远不会改变. 其次,我有一个数组 b[32768],其中包含 0 到 32 之间的整数.我使用这个数组将 a 中的所有数组映射到 32 个 bin: int bins[32]{};for (auto e : a[i])//将 a[i] 映射到 32 个 bi ..
发布时间:2021-12-20 16:18:16 C/C++开发

在许多 64 位位掩码上分别计算每个位位置,使用 AVX 而不是 AVX2

(相关:如何在 Sandy Bridge 上的一系列整数中快速将位计数到单独的 bin 中? 是此问题的早期副本,有一些不同的答案.编者注:这里的答案可能更好. 此外,还有一个类似问题的 AVX2 版本,一整排位的多个 bin 比一个宽得多 uint64_t:改进列人口计数算法) 我正在用 C 语言处理一个项目,我需要通过数千万个掩码(ulong 类型(64 位))并更新一个 64 短 ..
发布时间:2021-12-20 16:03:39 其他开发