相关疑难解决方法(0)

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

我有一个四个64位浮点值的打包向量.
我想得到向量元素的总和.

使用SSE(并使用32位浮点数),我可以执行以下操作:

v_sum = _mm_hadd_ps(v_sum, v_sum);
v_sum = _mm_hadd_ps(v_sum, v_sum);
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使AVX具有_mm256_hadd_pd指令,它的结果也与SSE版本不同.我相信这是因为大多数AVX指令分别用作每个低128位和高128位的SSE指令,而不会跨越128位边界.

理想情况下,我要寻找的解决方案应遵循以下准则:
1)仅使用AVX/AVX2指令.(没有SSE)
2)不超过2-3条指令.

但是,任何有效/优雅的方式(即使不遵循上述指导原则)总是被广泛接受.

非常感谢您的帮助.

-Luigi Castelli

x86 sse simd vector-processing avx

15
推荐指数
1
解决办法
2万
查看次数

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

我正在尝试使用simd内部函数在C中编程矩阵乘法。我非常确定自己的实现,但是执行时,我会从所得矩阵系数的第5位开始出现一些数字错误。

REAL_T只是具有typedef的浮点数

/* This is my matmul Version with simd, using floating simple precision*/
void matmul(int n, REAL_T *A, REAL_T *B, REAL_T *C){
  int i,j,k;
  __m256 vA, vB, vC, vRes;
  for (i=0; i<n; i++){
    for (j=0; j<n; j++){  
      for (k=0; k<n; k= k+8){
        vA = _mm256_load_ps(&A[i*n+k]);
        vB = _mm256_loadu_ps(&B[k*n+j]);
        vC = _mm256_mul_ps(vA, vB);
        vC = _mm256_hadd_ps(vC, vC);
        vC = _mm256_hadd_ps(vC, vC);
        /*To get the resulting coefficient, after doing 2 hadds,
        I have to get the first and the last element …
Run Code Online (Sandbox Code Playgroud)

c floating-point simd vectorization avx

5
推荐指数
1
解决办法
84
查看次数

这种使用 SSE 处理数组尾部的方法是否过度?

我正在摆弄 SSE,试图编写一个函数来将单精度浮点数组的所有值相加。我希望它适用于数组的所有长度,而不仅仅是 4 的倍数的数组,就像网络上几乎所有示例中所假设的那样。我想出了这样的事情:

float sse_sum(const float *x, const size_t n)
{
    const size_t
        steps = n / 4,
        rem = n % 4,
        limit = steps * 4;

    __m128 
        v, // vector of current values of x
        sum = _mm_setzero_ps(0.0f); // sum accumulator

    // perform the main part of the addition
    size_t i;
    for (i = 0; i < limit; i+=4)
    {
        v = _mm_load_ps(&x[i]);
        sum = _mm_add_ps(sum, v);
    }

    // add the last 1 - 3 odd items …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point sse

4
推荐指数
1
解决办法
742
查看次数

为什么在这种情况下,我的 Java 代码比我的 C++ 代码运行得更快?

我写了一个小基准,其中程序创建了 的 10 个8二维std::vector结构{float, float},然后将它们的长度平方相加。

这是C++代码:

#include <iostream>
#include <chrono>
#include <vector>
#include <array>
#include <cmath>
    
using namespace std;
using namespace std::chrono;
    
const int COUNT = pow(10, 8);
    
class Vec {
public:
    float x, y;
    
    Vec() {}
    
    Vec(float x, float y) : x(x), y(y) {}
    
    float len() {
        return x * x + y * y;
    }
};
    
int main() {
    vector <Vec> vecs;
    
    for(int i = 0; i < COUNT; ++i) {
        vecs.emplace_back(i …
Run Code Online (Sandbox Code Playgroud)

c++ java benchmarking microbenchmark

2
推荐指数
1
解决办法
118
查看次数