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

目录
相关文章
|
机器学习/深度学习 搜索推荐 算法
基于机器学习的用户行为分析与个性化推荐系统
传统的用户行为分析和推荐系统常常受限于规则的刻板和模型的简单,无法准确捕捉用户的个性化需求。本文基于机器学习技术,探讨了一种更加灵活、精准的用户行为分析与个性化推荐系统设计方法,通过深度学习模型结合大数据分析,实现了对用户行为的更细致把握和更个性化的推荐服务。
|
网络协议 网络安全 网络性能优化
使用到UDP协议的情况下该如何防护
使用到UDP协议的情况下该如何防护
|
监控
在 PowerShell 中获取内存使用率百分比
【8月更文挑战第27天】
440 5
|
机器学习/深度学习 PyTorch TensorFlow
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
645 2
|
编解码 安全 Windows
如何解决Windows电脑自动黑屏问题?
【8月更文挑战第19天】以下是可能导致Windows电脑自动黑屏的原因及解决方法:硬件问题包括显示器连接不良、显卡故障(如风扇不转或驱动过时)、内存条接触不良、CPU过热及电源供应不稳定。软件问题涉及系统故障(尝试系统还原或运行SFC扫描)、显卡驱动不兼容、软件冲突或恶意软件感染。此外,不当的电源管理和显示设置也可能引发黑屏。针对这些问题,采取相应的检查和修复措施通常可以解决问题。
1117 0
|
Serverless API
"Not Found"通常表示你试图访问的资源在服务器上不存在
"Not Found"通常表示你试图访问的资源在服务器上不存在
955 1
|
机器学习/深度学习 弹性计算 人工智能
【玩转AIGC系列】快速搭建AI对话机器人
本文介绍如何使用阿里云GPU云服务器,基于ChatGLM-6B语言模型快速搭建AI对话机器人。
【玩转AIGC系列】快速搭建AI对话机器人
|
人工智能 监控 安全
智慧工地:实现作业区域安全管控
智慧工地:实现作业区域安全管控
506 0
|
开发框架 JavaScript 前端开发
JS 后端框架盘点
JS 后端框架盘点
596 0
|
安全 算法 Go
有向图的强联通分量(SCC)Tarjan算法
有向图的强联通分量(SCC)Tarjan算法
641 0

热门文章

最新文章