AVX 指令集并行技术优化积分计算圆周率 π

简介: AVX 指令集并行技术优化积分计算圆周率 π

通过 AVX 指令集并行技术优化积分计算圆周率 π

完整代码和解释如下

// AVX_PI.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <immintrin.h>
#include <time.h>
#include "timer.h"
double compute_pi_naive(size_t dt)
{
  double pi = 0.0;
  double delta = 1.0 / dt;
  for (size_t i = 0; i < dt; i++)
  {
    double x = (double)i / dt;
    pi += delta / (1.0 + x*x);
  }
  return pi*4.0;
}
double compute_pi_avx(size_t dt)
{
  double pi = 0.0;
  double delta = 1.0 / dt;
  __m256d ymm0, ymm1, ymm2, ymm3, ymm4;
  ymm0 = _mm256_set1_pd(1.0); // 注意并不是对应一条指令,而是多条指令混合而成
  ymm1 = _mm256_set1_pd(delta);
  ymm2 = _mm256_set_pd(delta * 3, delta * 2, delta, 0.0); // 0.0, delta, 2*delta, 3*delta
  ymm4 = _mm256_setzero_pd();
  for (int i = 0; i <= dt - 4; i += 4)
  {
    ymm3 = _mm256_set1_pd(i * delta); // 归一化构造 x(积分区间为 0-1)
    ymm3 = _mm256_add_pd(ymm3, ymm2); // 分别累加四项(分别相差一个delta)
    ymm3 = _mm256_mul_pd(ymm3, ymm3); // 平方
    ymm3 = _mm256_add_pd(ymm0, ymm3); // + 1
    ymm3 = _mm256_div_pd(ymm1, ymm3);   // delta 向量除
    ymm4 = _mm256_add_pd(ymm4, ymm3); // 累加
  }
#ifndef _WIN32
  double tmp[4] __attribute__((aligned(32)));
#else
//#pragma pack(8)
  __declspec(align(32)) // arm 下的内存边界对齐使用 __align
  double tmp[4];
//#pragma pack()
#endif
  _mm256_store_pd(tmp, ymm4);
  pi = tmp[0] + tmp[1] + tmp[2] + tmp[3];
  return pi * 4.0;
}
int _tmain(int argc, _TCHAR* argv[])
{
  size_t dt = 1e10;
  Timer timer;
  double pi_naive = compute_pi_naive(dt);
  printf("Pi = %lf, %lfms\n", pi_naive, timer.elapsed());
  timer.restart();
  double pi_avx = compute_pi_avx(dt);
  printf("Pi = %lf, %lfms\n", pi_avx, timer.elapsed());
  return 0;
}

最后输出的结果,获得了 3 倍多的加速(耗时不到原来串行版本的 1/4 )

image.png

目录
相关文章
AVX 指令集并行技术优化中值滤波
AVX 指令集并行技术优化中值滤波
245 0
AVX 指令集并行技术优化中值滤波
|
8月前
|
机器学习/深度学习 人工智能 并行计算
从LLM中完全消除矩阵乘法,效果出奇得好,10亿参数跑在FPGA上接近大脑功耗
【6月更文挑战第15天】`Scalable MatMul-free LMs提出了一种无需矩阵乘法的新方法,使用MLGRU和MatMul-free GLU在保持性能的同时降低计算成本。实验显示,这种模型在FPGA上运行时,能效接近人脑,且在多种任务中与传统模型相当甚至更优。尽管有挑战,但该模型为高效、低功耗的语言处理开辟了新途径。[arXiv:2406.02528]`
178 1
积和式Permanent在Mathematica中的运算
Permanent[m_List] := With[{v = Array[x, Length[m]]}, Coefficient[Times @@ (m.v), Times @@ v]]   参考资料: http://mathworld.wolfram.com/Permanent.html
587 0
|
9月前
|
存储 编解码 算法
没有DSP的浮点单元不能进行浮点运算?
没有DSP的浮点单元不能进行浮点运算?
113.实矩阵乘法运算
113.实矩阵乘法运算
134 0
|
算法 C++
C++使用cuBLAS加速矩阵乘法运算
C++使用cuBLAS加速矩阵乘法运算
1.3 函数的极限
1.3 函数的极限
93 0
函数与极限
函数与极限
135 0

热门文章

最新文章