美文网首页
avx256 计算点积

avx256 计算点积

作者: GOGOYAO | 来源:发表于2021-12-22 13:04 被阅读0次
#include <immintrin.h>

#include <iostream>
#include <vector>
bool DotProductSimd256(const std::vector<float>& emb_1,
                       const std::vector<float>& emb_2, double& res) {
  const static size_t kBlockWidth = 8;  // compute 8 floats in one loop
  res = 0;
  const float* a = emb_1.data();
  const float* b = emb_2.data();
  int k = emb_1.size() / kBlockWidth;
  for (int i = 0; i < k; i++) {
    __m256 ai = _mm256_loadu_ps(a + i * kBlockWidth);
    __m256 bi = _mm256_loadu_ps(b + i * kBlockWidth);
    __m256 r = _mm256_dp_ps(ai, bi, 0xF1);
    // debug for the output;
    // for (int i = 0; i < 8; i++) std::cout << r[i] << std::endl;
    res += (r[0] + r[4]);
  }
  return true;
}

bool DotProduct(const std::vector<float>& emb_1,
                const std::vector<float>& emb_2, double& res) {
  res = 0;
  for (int i = 0; i < emb_1.size(); i++) {
    res = res + (emb_1[i] * emb_2[i]);
  }
  return true;
}

int main(int argc, char* argv[]) {
  std::vector<float> f_vec_1;
  std::vector<float> f_vec_2;
  const int len = 8;
  for (int i = 0; i < len; i++) {
    f_vec_1.push_back(0.01 * (i + 1));
    f_vec_2.push_back(0.01 * (i + 1));
  }

  double res = 0;
  DotProductSimd256(f_vec_1, f_vec_2, res);
  std::cout << "use avx res = " << res << std::endl;

  DotProduct(f_vec_1, f_vec_2, res);
  std::cout << "not use avx res = " << res << std::endl;
  return 0;
}

编译方法:gcc -mavx2 -std=c++11 -g -lstdc++ main.cpp
查看机器是否支持avx2:lscpu | grep avx2
simd性能提升一倍以上。
ps:如果开启-O3编译选项,由于编译器的优化效果,simd版本可能会没有任何优势

相关文章

  • avx256 计算点积

    编译方法:gcc -mavx2 -std=c++11 -g -lstdc++ main.cpp查看机器是否支持av...

  • numpy计算点积叉积和混合积

    1.源码实现 2.运行及其结果

  • OpenGL(3) —— OpenGL 的矩阵变换

    基本计算 向量之间的计算有 点积、叉积。矩阵之间的计算有加减、数乘、矩阵间乘法。 矩阵的缩放 位移 旋转 一个向量...

  • 核方法 Kernel method

    1.内积(点积) 内积,又叫做点积,数量积或标量积。假设存在两个向量和,内积的计算方法为: 2.核方法 [1][#...

  • 矩阵乘法与Numpy Dot

    Numpy Dot 用来计算两个向量之间的点积,点积:每个条目的数相乘后相加 例:a = [1 ,2, 3, 4]...

  • OpenGL - 获取法向量

    计算一个法向量 计算矢量积向量 用这个矢量积向量的长度/矢量积的每个分量 获取两个点形成的的向量 返回一个单位法向量

  • 判断前后左右和求角度

    计算目标在自己的哪个方向,可以利用向量的点积求解。

  • 点积与对偶性

    点积的对偶性 互为镜像的两个向量计算如下 为什么点积计算与投影相关 多维空间之间的线性变换对于这种变换线性变换有更...

  • shader 所需的数学公示_向量/矢量_01

    向量/矢量v(x,y,z) 模 点积 v1 在v2上的投影长度 (>0 方向相同 反之) 叉积 向量叉积来计算垂直...

  • 矢量积运算

    矢量积是用来计算法向量的。 矢量叉积计算 :a * b = absinθ 0 <= θ <= 180° z = x...

网友评论

      本文标题:avx256 计算点积

      本文链接:https://www.haomeiwen.com/subject/zsrqqrtx.html