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

目录
相关文章
|
5月前
|
缓存 安全 网络安全
0x80070002错误代码怎么解决?
以下是解决Windows系统错误代码0x80070002的多种方法,综合了高可信度来源的解决方案:
|
Android开发 索引 容器
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
522 0
|
5月前
|
C++
什么是单项式
单项式是代数式中的一种
|
6月前
|
安全 Linux iOS开发
Tenable Nessus 10.9.0 发布,新增功能简介
Tenable Nessus 10.9.0 (macOS, Linux, Windows) - 漏洞评估解决方案
307 0
 Tenable Nessus 10.9.0 发布,新增功能简介
|
9月前
|
自然语言处理 安全 数据管理
二维码一个个生成太麻烦?试试批量生码功能
如果你正在处理成百上千条数据,又正好有生成二维码的需求,不妨试试这个工具。几分钟的学习,可能就能为你节省几天的工作时间
二维码一个个生成太麻烦?试试批量生码功能
|
10月前
|
存储 架构师 安全
【亲测有用】数据中台数据安全管理能力演示(更新篇)
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
机器学习/深度学习 弹性计算 运维
云计算系列之阿里云ECS服务器管理实战
本文档介绍了阿里云ECS(Elastic Compute Service)的基本概念、实例管理、磁盘操作、快照与镜像功能及其应用场景,最后通过具体案例解析ECS的实际应用。ECS是阿里云提供的高效、可靠的云计算服务,支持多种业务需求,如Web应用、高并发网站、数据库等,帮助企业快速构建稳定安全的应用,提升运维效率,降低IT成本。文档还详细说明了ECS实例的创建方式、连接方法及日常管理操作,帮助用户更好地利用ECS服务。
437 2
云计算系列之阿里云ECS服务器管理实战
|
存储 供应链 监控
为什么要开发海外电商代购系统?
在全球化背景下,海外电商代购系统应运而生,不仅满足了消费者对海外商品的多元需求,提升了商品品质和价格优势,还促进了国际贸易与文化交流,创造了商业机会和就业岗位。该系统通过优化供应链管理,提高了服务质量和用户体验,适应了消费升级和电商市场的发展趋势。未来,随着全球化进程的推进,海外电商代购系统将迎来更广阔的发展前景。
277 0
|
机器学习/深度学习 人工智能 搜索推荐
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
393 1