simd相关内容

AVX性能对于按位XOR运算和POP计数较慢

我对编写一些基于AVX内部函数的代码是新手,所以需要一些帮助来理解我的观察结果。我有两个实现距离计算的方法,这两个方法都接受2个浮点数组及其维度,并返回一个浮点距离。第一种方法计算欧几里得距离 static float compute_l2Square(const void *pVect1v, const void *pVect2v, const void *qty_ptr) ..
发布时间:2022-08-17 19:03:27 其他开发

使用NumPy对uint16和uint64阵列求和时没有加速?

我必须对相对较小的整数进行大量的运算(加法),我开始考虑哪种数据类型在64位计算机上性能最好。 我确信,将4uint16加在一起将花费与uint64相同的时间,因为ALU只使用1uint64加法器就可以进行4uint16加法。(进位传播意味着这对于单个64位加法器来说不是那么容易工作,但这就是整数SIMD指令的工作方式。) 显然不是这样的: In [3]: data = np.ran ..
发布时间:2022-08-17 18:47:02 Python

在Linux内核中生成和优化文件中的FP/SIMD代码,其中包含KERNEL_FPU_BEGIN()?

我知道禁止在内核中使用任何形式的浮点代码,我们永远不应该使用任何可能生成FP/SIMD指令的GCC标志,但一些使用kernel_fpu_begin()和kernel_fpu_end()的源代码(特别是arch/x86/crypto/*)怎么办? Example 1,example 2。 我有一个老式英特尔酷睿2双核CPU,用于我的64位Linux内核,并且在主要Makefile中我使用 ..

CPU中的新指令集

每一代新CPU都会引入一些新的指令集,如MMX、3DNOW、SSE等。 我有几个关于它们的一般性问题: 如果某些程序使用例如SSE指令,它是否可以在不支持SSE的CPU上运行? 如果是,是否意味着这些指令将更改为更多更简单的指令? 如果没有,这是否意味着这些新指令的真正性能影响将在几年后,届时大多数CPU将支持这种技术(因此不会有任何不兼容)? 当我编译一个经过优化的C++程序时 ..
发布时间:2022-07-12 21:05:29 其他开发

从AVX寄存器中提取并存储交替的低32位

我有一个__m256i寄存器,我想从每个64位组中提取4个低32位,将它们打包并连续存储到内存中。即,如果__m256i寄存器包含8个32位字:{a0,a1,a2,a3,a4,a5,a6,a7},我希望将四个字{a0,a2,a4,a6}连续存储到存储器 我编写了以下代码: void mystore(uint32 *dst, const __m256i& src) { __m ..
发布时间:2022-03-16 23:42:56 其他开发

NEON 简单向量赋值内在?

将 uint32x4_t 类型的 r1、r3 和 r4 加载到 NEON 寄存器中,我有以下代码: r3 = veorq_u32(r0,r3);r4 = r1;r1 = vandq_u32(r1,r3);r4 = veorq_u32(r4,r2);r1 = veorq_u32(r1,r0); 我只是想知道 GCC 是否真的将 r4 = r1 翻译成 vmov 指令.看着反汇编的代码,我并不感到 ..
发布时间:2022-01-17 14:25:01 其他开发

在 ARMv7a 上与 Neon 进行 64 位签名比较支持 CMGT 的最有效方法是什么?

这个问题最初是为 这里是 SSE2.由于每个算法都与 ARMv7a+NEON 对相同操作的支持重叠,因此更新了问题以包括 ARMv7+NEON 版本.应评论者的要求,在此处提出此问题以表明它确实是一个单独的主题,并提供可能对 ARMv7+NEON 更实用的替代解决方案.这些问题的最终目的是找到考虑到 WebAssembly SIMD 的理想实现. 解决方案 有符号 64 位饱和减法. ..
发布时间:2022-01-17 13:54:35 其他开发

ARM和NEON可以并行工作吗?

这是参考问题:内部 Neon 的校验和代码实现 打开链接中列出的子问题作为单独的问题.由于多个问题不能作为单线程的一部分提出. 不管怎样,问题来了: ARM 和 NEON(就 arm cortex-a8 架构而言)真的可以并行工作吗?我怎样才能做到这一点? 有人可以指点我或分享一些示例实现(伪代码/算法/代码,而不是理论实现论文或演讲),它们一起使用了 ARM-NEON 的 ..
发布时间:2022-01-17 13:38:24 其他开发

检查所有 __m128i 组件是否为 0 的最有效方法 [使用 <= SSE4.1 内在函数]

我正在使用 SSE 内在函数来确定一个矩形(由四个 int32 值定义)是否发生了变化: __m128i oldRect;//包含旧的左、上、右、下打包为 128 位__m128i 新矩形;//包含新的左、上、右、下打包为 128 位__m128i xor = _mm_xor_si128(oldRect, newRect); 此时,如果矩形没有更改,则生成的 xor 值将全为零.那么确定这一点 ..
发布时间:2022-01-14 14:48:37 C/C++开发

AVX-512 和分支

我对掩蔽在理论上可以对分支做什么感到困惑.假设我有一个 Skylake-SP(哈哈,我希望..),我们忽略了编译器功能,这在理论上是可能的: 如果一个分支条件依赖于一个静态标志,并且所有分支都将一个数组设置为一个计算结果,假设编译器无论如何都不会将其优化为两个单独的循环,它可以向量化吗? 做 i = 1, nx如果 (my_flag .eq. 0) 那么a(i) = b(i) ** 2别的 ..
发布时间:2022-01-14 09:45:42 其他开发

如何将两个_pd 转换为一个_ps?

我正在循环一些数据,计算一些 double 和每 2 个 __m128d 操作,我想将数据存储在 __m128 浮点数上. 所以 64+64 + 64+64 (2 __m128d) 存入 1 32+32+32+32 __m128. 我做这样的事情: __m128d v_result;__m128 v_result_float;...//对 v_result 的一些操作//将前两个“槽 ..
发布时间:2022-01-13 08:20:36 C/C++开发

分支和谓词指令

第 5.4.2 节 声明分支分歧由“分支指令"或在某些条件下“谓词指令"处理.我不明白两者之间的区别,以及为什么一个比另一个带来更好的性能. 此评论表明分支指令会导致更多执行指令的数量,由于“分支地址解析和获取"而停止,以及由于“分支本身"和“为分歧而记账"导致的开销,而谓词指令仅导致“进行条件测试和设置的指令执行延迟"谓词".为什么? 解决方案 指令谓词是指一条指令由一个线程根据谓 ..
发布时间:2022-01-10 15:53:02 其他开发

浮点向量的 SSE 缩减

如何使用 sse 内在函数获取浮点向量的总和元素(减少)? 简单的序列号: void(float *input, float &result, unsigned int NumElems){结果 = 0;for(auto i=0; i 解决方案 通常在循环中生成 4 个部分和,然后在循环后对 4 个元素进行水平求和,例如 #include #include ..
发布时间:2022-01-09 15:44:07 C/C++开发

Simd matmul 程序给出不同的数值结果

我正在尝试使用 simd 内在函数在 C 中编写矩阵乘法.我很确定我的实现,但是当我执行时,从结果矩阵系数的第 5 位开始出现一些数值错误. REAL_T 只是一个带有 typedef 的浮点数 /* 这是我的带有 simd 的 matmul 版本,使用浮动简单精度*/void matmul(int n, REAL_T *A, REAL_T *B, REAL_T *C){整数 i,j,k; ..
发布时间:2022-01-09 10:18:47 其他开发

将 16 字节字符串与 SSE 进行比较

我有 16 字节的“字符串"(它们可能更短,但您可能会假设它们在末尾用零填充),但您可能不会假设它们是 16 字节对齐的(至少并非总是如此). 如何编写一个例程将它们(相等)与 SSE 内在函数进行比较?我发现此代码片段可能会有所帮助,但我不确定它是否合适? 注册__m128i xmm0, xmm1;注册 unsigned int eax;xmm0 = _mm_load_epi128((_ ..
发布时间:2022-01-06 13:08:32 其他开发