intrinsics相关内容

C/C++中高效的溢出免疫算术平均值

两个无符号整数的算术平均值定义为: mean = (a+b)/2 在C/C++中直接实现它可能会溢出并产生错误的结果。正确的实现可以避免这种情况。一种编码方式可能是: mean = a/2 + b/2 + (a%2 + b%2)/2 但这会使用典型的编译器生成相当多的代码。在汇编程序中,这通常可以更高效地完成。例如,x86可以通过以下方式做到这一点(汇编伪代码,我希望您明白这一 ..
发布时间:2022-08-17 18:57:39 C/C++开发

从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 其他开发

g++-4.8 中缺少 AVX 日志内在函数 (_mm256_log_ps)?

我正在尝试在我的代码中使用一些 AVX 内在函数,但遇到了对数内在函数的障碍. 使用适用于 Linux 的英特尔内部指南 v3.0.1,我看到内部 _mm256_log_ps(__m256) 被列为“immintrin.h"的一部分,并且在我当前的架构中也受支持. 但是,尝试编译这个简单的测试用例失败并显示“错误:'_mm256_log_ps' 未在此范围内声明" 示例使用g++ ..
发布时间:2022-01-23 20:52:36 C/C++开发

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 其他开发

与 NEON 内在函数的数据类型兼容性

我正在使用 C++ 代码中的 NEON 内在函数进行 ARM 优化.我理解并掌握了大部分打字问题,但我被困在这个问题上: 指令 vzip_u8 返回一个 uint8x8x2_t 值(实际上是两个 uint8x8_t 的数组).我想将返回的值分配给一个普通的 uint16x8_t.我没有看到合适的 vreinterpretq 内在实现这一点,并且简单的强制转换被拒绝. 解决方案 一些定 ..
发布时间:2022-01-17 14:03:43 其他开发

将 8bit uint8_t 加载为 uint32_t?

我的图像处理项目使用灰度图像.我有 ARM Cortex-A8 处理器平台.我想使用NEON. 我有一个灰度图像(考虑下面的示例),在我的算法中,我只需要添加列. 如何并行加载 四个 8 位像素值,它们是 uint8_t,作为 四个 uint32_t 到 128- 之一位 NEON 寄存器?我必须使用什么内在函数来做到这一点? 我的意思是: 我必须将它们加载为 32 位,因 ..
发布时间:2022-01-17 14:03:19 其他开发

为什么编译器没有定义 __ARM_FEATURE_CRC32?

我已经研究这个问题一段时间了,我希望有人能指出我的错误.我想我再也看不到森林了. 我有一个用于测试的 LeMaker HiKey 开发板.它的 AArch64,因此它具有 NEON 和其他 cpu 功能,如 AES、SHA 和 CRC32: $ cat/proc/cpuinfo处理器:AArch64 处理器版本 3 (aarch64)...特点: fp asimd evtstrm aes ..
发布时间:2022-01-17 13:55:18 C/C++开发

NEON 包矢量比较结果成位图

我有一个比较两个浮点操作数的比较结果如下;我需要做的是根据比较结果需要执行以下操作:即: neon_gt_res = vcgtq_f32(temp1, temp2);if(neon_gt_res[0]) 数组[0] |= (unsigned char)0x01;if(neon_gt_res[1]) 数组[0] |= (unsigned char)0x02;if(neon_gt_res[2]) 数 ..
发布时间:2022-01-17 13:54:43 其他开发

JVM 什么时候使用内部函数

为什么在 JVM 内部类中存在的某些代码模式被转换为内部函数,而从我自己的类中调用的相同模式却不是. 例子: bitCount 函数,当从 Integer.bitCount(i) 中调用时,将变成一个内在函数.但是,当复制到我的班级然后被调用时,将需要更长的时间来执行. 比较 Integer.bitCount(i)MyClass.bitCount(i)公共静态 int bitC ..
发布时间:2022-01-16 11:53:49 Java开发

检查所有 __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++开发

matmul 内在函数的 Fortran 数组排名

以下链接 https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gfortran/MATMUL.html 明确指出 gfortran 期望输入到 matmul 的矩阵的等级为 1 或 2.但是以下代码段无法编译: 程序草稿真实(种类=8)::A(10)=(/0,1,2,3,4,5,6,7,8,9/)真实(种类=8)::B(10)=(/0,1,2,3,4,5,6,7,8 ..
发布时间:2022-01-14 10:09:12 其他开发

将 __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 其他开发

是否可以使用 PTEST 来测试两个寄存器是否都为零或其他条件?

你可以用 SSE4.1 ptest 做什么其他比测试单个寄存器是否全为零? 您能否结合使用 SF 和 CF 来测试有关两个未知输入寄存器的任何有用信息? PTEST 有什么用?您认为检查打包比较的结果(如 PCMPEQD 或 CMPPS)会很好,但至少在英特尔 CPU 上,使用 PTEST + JCC 进行比较和分支比使用 PMOVMSK(B/PS/PD) + 宏融合 CMP 花费更多 ..
发布时间:2022-01-06 13:05:24 其他开发

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++开发

英特尔内在函数中的延迟与吞吐量

总的来说,我认为我对延迟和吞吐量之间的区别有很好的理解.但是,对于英特尔 Intrinsics,我不清楚延迟对指令吞吐量的影响,尤其是在按顺序(或几乎按顺序)使用多个内部调用时. 例如,让我们考虑: _mm_cmpestrc 这在 Haswell 处理器上的延迟为 11,吞吐量为 7.如果我在循环中运行这条指令,我会在 11 个周期后获得一个连续的每个周期输出吗?由于这需要一次运行 11 ..
发布时间:2022-01-06 12:55:56 其他开发

x86 SIMD 内在函数的头文件

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

intel avx2 中是否有与 movemask 指令相反的指令?

movemask 指令采用 __m256i 并返回一个 int32,其中每一位(前 4、8 或所有 32 位,取决于输入向量元素类型)是相应向量元素的最高有效位. 我想做相反的事情:取 32(其中只有 4、8 或 32 个最低有效位有意义),并获得 __m256i,其中设置了每个 int8、int32 或 int64 大小的块的最高有效位到原来的位. 基本上,我想从一个压缩的位掩码变成 ..
发布时间:2022-01-06 12:15:58 其他开发