sse相关内容

可移植地编写 x86 asm 函数 (win/linux/osx),而不依赖于 yasm/nasm?

par2 有一个小巧且相当干净的 C++ 代码库,我认为它在 GNU/Linux 上构建得很好,OS X 和 Windows(使用 MSVC++). 我想合并一个几乎占用所有 CPU 时间的函数的 x86-64 asm 版本.(包含更多详细信息的邮件列表帖子.我的实施/基准测试.) Intrinsics 是显而易见的解决方案,但 gcc 没有生成足够好的代码来一次从 64 位寄存器中获 ..
发布时间:2021-12-22 18:55:59 其他开发

矢量的数据是如何对齐的?

如果我想用 SSE 处理 std::vector 中的数据,我需要 16 字节对齐.我怎样才能做到这一点?我需要编写自己的分配器吗?或者默认分配器是否已经与 16 字节边界对齐? 解决方案 C++ 标准需要分配函数(malloc() 和 operator new())来适当地分配内存对齐任何标准类型.由于这些函数不接收对齐要求作为参数,实际上这意味着所有分配的对齐方式是相同的,并且是具有最 ..
发布时间:2021-12-21 13:25:35 C/C++开发

AVX 标量操作要快得多

我测试了下面的简单函数 void mul(double *a, double *b) {for (int i = 0; i 具有非常大的数组,因此它受内存带宽限制.我使用的测试代码如下.当我用 -O2 编译时,它需要 1.7 秒.当我用 -O2 -mavx 编译时,它只需要 1.0 秒.非 vex 编码的标量操作慢 70%!这是为什么? 这是-O2 和-O2 -mavx 的程序集. 的 ..
发布时间:2021-12-21 10:14:11 其他开发

重叠数组的总和、自动矢量化和限制

Arstechnia 最近有一篇文章 为什么有些编程语言比其他语言快.它比较了 Fortran 和 C 并提到了求和数组.在 Fortran 中,假设数组不重叠,以便进一步优化.在 C/C++ 中,指向同一类型的指针可能会重叠,因此通常不能使用这种优化.但是,在 C/C++ 中,可以使用 restrict 或 __restrict 关键字告诉编译器不要假设指针重叠.所以我开始研究关于自动矢量化的问 ..
发布时间:2021-12-20 16:29:03 C/C++开发

如何判断内存是否对齐?

我是使用 SSE/SSE2 指令优化代码的新手,直到现在我还没有走多远.据我所知,一个常见的 SSE 优化函数如下所示: void sse_func(const float* const ptr, int len){if(ptr 对齐){为了( ... ){//将循环展开 4 或 2 个元素}为了( ....){//处理剩下的//(非优化代码)}} 别的 {为了( ....){//处理非对齐内存 ..
发布时间:2021-12-20 16:01:46 其他开发

从 RGB 到 BGRA 的快速矢量化转换

在对之前关于将 RGB 转换为 RGBA 和 ARGB 到 BGR 的一些问题的跟进中,我想使用 SSE 加速 RGB 到 BGRA 的转换.假设是 32 位机器,并且想要使用内部函数.我很难将源缓冲区和目标缓冲区对齐以使用 128 位寄存器,并寻求其他精明的矢量化解决方案. 要向量化的例程如下... void RGB8ToBGRX8(int w, const void *in, voi ..
发布时间:2021-12-19 18:01:58 其他开发

更好的 8x8 字节矩阵转置与 SSE?

我发现这篇文章解释了如何使用 24 次操作转置一个 8x8 字节的矩阵,稍后滚动几下实现转置的代码.但是,这种方法没有利用我们可以阻止将 8x8 转置成四个 4x4 转置的事实,并且每个转置只能在一个 shuffle 指令中完成(这篇文章是参考).所以我想出了这个解决方案: __m128i transpose4x4mask = _mm_set_epi8(15, 11, 7, 3, 14, 10, ..
发布时间:2021-12-19 08:15:29 其他开发

如何将标量合并为向量而不编译器浪费指令将上元素归零?英特尔内在函数的设计限制?

我没有想到特定的用例;我在问这是否真的是英特尔内在函数的设计缺陷/限制,或者我是否只是遗漏了一些东西. 如果您想将标量浮点数与现有向量相结合,似乎没有办法在没有高元素归零或使用 Intel 内在函数将标量广播到向量的情况下做到这一点.我还没有研究过 GNU C 原生向量扩展和相关的内置函数. 如果额外的内在优化消失,这不会太糟糕,但它不会与 gcc(5.4 或 6.2).也没有很好的方 ..
发布时间:2021-12-18 22:41:59 其他开发

orpd等SSE2指令的意义何在?

orpd 指令是“压缩双精度浮点值的按位逻辑或".这不是与 por(“按位逻辑或")完全相同的事情吗?如果是这样,拥有它有什么意义? 解决方案 记住 SSE1 orps 先到先得.(实际上 MMX por mm, mm/mem 甚至更早出现SSE1.) 具有相同操作码和新前缀的是 SSE2 orpd 指令对硬件解码器逻辑很有意义,我想,就像 movapd 与 movaps 一样.在 ..
发布时间:2021-12-18 09:35:09 其他开发

AVX2 中的 VPERMB 在哪里?

AVX2 有很多好东西.例如,它有很多指令,它们比它们的前身更强大.以 VPERMD 为例:它允许您完全任意广播/将一个 256 位长的 32 位值向量混洗/置换到另一个向量中,在运行时可选择置换1.从功能上讲,这淘汰了大量现有的旧解包、广播、置换、洗牌和移位指令3. 酷豆. 那么 VPERMB 在哪里?即,相同的指令,但处理字节大小的元素.或者,就此而言,对于 16 位元素,VPER ..
发布时间:2021-12-18 09:30:52 其他开发

高效的 4x4 矩阵乘法(C 与汇编)

我正在寻找一种更快、更棘手的方法来在 C 中将两个 4x4 矩阵相乘.我目前的研究重点是带有 SIMD 扩展的 x86-64 汇编.到目前为止,我已经创建了一个比简单的 C 实现快 6 倍的函数,这超出了我对性能改进的预期.不幸的是,这仅在没有使用优化标志进行编译时才成立(GCC 4.7).使用 -O2,C 变得更快,而我的努力变得毫无意义. 我知道现代编译器利用复杂的优化技术来实现几乎完美 ..
发布时间:2021-12-18 09:26:45 其他开发

使用 SSE 在 __m128i 向量中获取最大值?

我刚刚开始使用 SSE,我很困惑如何获得 __m128i 的最大整数值 (max).例如: __m128i t = _mm_setr_ps(0,1,2,3);//max(t) = 3; 四处搜索使我找到了 MAXPS 指令,但我似乎无法找到如何将其与 "xmmintrin.h" 一起使用. 另外,是否有任何您会推荐的 "xmmintrin.h" 文档,而不是查看头文件本身? 解决方 ..
发布时间:2021-12-18 09:23:21 其他开发

混合 SSE 整数/浮点 SIMD 指令时是否会降低性能

我最近经常以内在函数的形式使用 x86 SIMD 指令 (SSE1234).我发现令人沮丧的是,SSE ISA 有几个简单的指令,这些指令仅适用于浮点数或仅适用于整数,但理论上应该对两者执行相同.例如,float 和 double 向量都有从地址(movhps、movhpd)加载 128 位向量的更高 64 位的指令,但没有这样的整数指令向量. 我的问题: 在整数向量上使用浮点指令时, ..
发布时间:2021-12-18 09:21:47 其他开发

是否可以使用 SSE 和 SSE2 生成 128 位宽的整数?

我想进一步了解 SSE2 的功能,想知道是否可以制作一个 128 位宽的整数来支持加法、减法、XOR 和乘法? 解决方案 SIMD 旨在同时处理多个小值,因此不会有任何结转到更高单元,您必须手动执行此操作.在 SSE2 中没有进位标志,但您可以轻松地将进位计算为 carry = sum 或 carry = sum 喜欢这个.更糟糕的是,SSE2 也没有 64 位比较,因此您必须使用一些解决 ..
发布时间:2021-12-18 08:54:33 其他开发

打印一个 __m128i 变量

我正在尝试使用内在函数学习编码,下面是一个可以添加的代码 使用的编译器:icc #include#includeint main(){__m128i a = _mm_set_epi32(1,2,3,4);__m128i b = _mm_set_epi32(1,2,3,4);__m128i c;c = _mm_add_epi32(a,b);printf("%d\n",c[2]);返回0;} ..
发布时间:2021-12-18 08:42:12 其他开发