22得票5回答
如何将两个__m128值合并为__m256?

我想将两个__m128值合并为一个__m256。 例如:__m128 a = _mm_set_ps(1, 2, 3, 4); __m128 b = _mm_set_ps(5, 6, 7, 8); 变成类似于这样的内容:__m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 };...

22得票2回答
对齐和不对齐的x86 SIMD指令之间的选择

通常有两种类型的SIMD指令: A. 一种是适用于对齐内存地址的指令,如果地址没有对齐到操作数大小的边界,将引发一般保护异常(#GP):movaps xmm0, xmmword ptr [rax] vmovaps ymm0, ymmword ptr [rax] vmovaps zmm0, ...

22得票5回答
使用AVX/AVX2转置一个8x8的浮点数

通过制作四个4x4矩阵并对它们进行转置,可以实现8x8矩阵的转置。但这不是我要的。 在另一个问题中,一个答案提供了一个解决方案,只需要24条指令就能处理8x8矩阵。然而,这不适用于浮点数。 由于AVX2包含256位寄存器,每个寄存器可以容纳八个32位整数(浮点数)。但问题是: 如何使用A...

22得票6回答
如何在Java中使用英特尔AVX技术?

我该如何从Java中使用Intel AVX向量指令集?这是一个简单的问题,但答案似乎很难找到。

22得票3回答
如何解决AVX加载/存储操作的32字节对齐问题?

我在使用ymm寄存器时遇到了对齐问题,代码片段看起来对我来说似乎很好。这里是一个最小的工作示例:#include <iostream> #include <immintrin.h> inline void ones(float *a) { __m256 o...

21得票2回答
从两个数组的点积测量内存带宽

两个数组的点积 for(int i=0; i<n; i++) { sum += x[i]*y[i]; } 不重用数据,因此应该是一个内存绑定操作。因此,我应该能够从点积中测量内存带宽。 使用why-vectorizing-the-loop-does-not-have-pe...

20得票2回答
如何对__m256进行水平求和?

我想使用AVX指令对__m256向量的组成部分进行水平求和。 在SSE中,我可以使用_mm_hadd_ps(xmm,xmm); _mm_hadd_ps(xmm,xmm); 要获得向量第一个元素的结果,但这种方法在256位版本的函数(_mm256_hadd_ps)中无法扩展。 如何计算一个__...

20得票5回答
禁用glibc中的AVX优化函数(LD_HWCAP_MASK、/etc/ld.so.nohwcap),以便在valgrind和gdb记录中使用。

现代的x86_64 Linux系统使用glibc可以检测CPU是否支持AVX扩展,并将许多字符串函数从通用实现切换到AVX优化版本(通过ifunc调度程序协助:1,2)。 这个特性对于性能可能有好处,但它会阻止一些工具正常工作,例如valgrind(旧的libVEXs,在 valgrind-...

20得票5回答
SSE-copy、AVX-copy和std::copy的性能表现

我试图通过SSE和AVX来提高复制操作的性能: #include <immintrin.h> const int sz = 1024; float *mas = (float *)_mm_malloc(sz*sizeof(float), 16); f...

20得票2回答
英译中:英特尔芯片上的半精度浮点运算

在英特尔芯片上执行半精度浮点运算是否可能? 我知道如何加载/存储/转换半精度浮点数[1],但我不知道如何在不转换为单精度浮点数的情况下进行加法/乘法运算。 [1] https://software.intel.com/en-us/articles/performance-benefits-...