美文网首页
C++avx256指令集加速实例

C++avx256指令集加速实例

作者: icfg66 | 来源:发表于2020-10-07 13:43 被阅读0次

背景

avx256是x86cpu架构下实现SIMD(单指令多数据)的指令集。它能够利用cpu内部256bit的寄存器,同时对4位double或8位int类型的数操作,达到很好的加速效果。这里通过一个计算\pi的实例来展示其威力:
\pi = 4\int_0^1\frac{1}{1+x^2}dx
linux系统下可以通过如下命令查看电脑是否支持avx256指令集:

cat /proc/cpuinfo | grep flags

image.png

sse4就表示该指令集。

//g++ avx_pi.cpp -mavx -O2 
#include <iostream>
#include <ctime>
#include <x86intrin.h>
using namespace std; 
//正常的逐个累加运算
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+x*x);
    }
    return pi*4.0;
}
//利用avx256指令集
double compute_pi_avx256(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);
    ymm4 = _mm256_setzero_pd();
    for (int i = 0;i<dt-4;i+=4){
        ymm3 = _mm256_set1_pd(i*delta);
        ymm3 = _mm256_add_pd(ymm3,ymm2);
        ymm3 = _mm256_mul_pd(ymm3,ymm3);
        ymm3 = _mm256_add_pd(ymm0,ymm3);
        ymm3 = _mm256_div_pd(ymm1,ymm3);
        ymm4 = _mm256_add_pd(ymm4,ymm3);        
    }
    double tmp[4] __attribute__((aligned(32)));
    _mm256_store_pd(tmp,ymm4);
    pi += tmp[0]+tmp[1]+tmp[2]+tmp[3];
    return pi*4.0;
}
int main(){
    clock_t start,end;
    size_t dt = 134217728;
    double result1,result2;
    //普通函数计时
    start = clock();
    result1 = compute_pi_naive(dt);
    end  = clock();
    cout<<"naive:\n"<< result1 <<endl<<end- start <<endl;
    //avx256计时
    start = clock();
    result2 = compute_pi_avx256(dt);
    end  = clock();
    cout<<"avx256:\n" <<result2 <<endl<<end- start <<endl;

    return 0;
}
image.png

可以看出,速度提高了两倍多。

相关文章

  • C++avx256指令集加速实例

    背景 avx256是x86cpu架构下实现SIMD(单指令多数据)的指令集。它能够利用cpu内部256bit的寄存...

  • Some Blogs

    SSE c/c++ 代码中使用sse指令集加速 evo evo工具kitti转tumevo wiki

  • Android 几个常用的 sensor 简单使用实例

    光线传感器的使用实例: 对应的布局文件如下: 加速度传感器的使用实例: 加速度传感器实例对应的布局文件代码如下(默...

  • UIKit总结

    1.UIAcceleration 被叫做加速事件的一个UIAcceleration类的实例是用来代表即时的三维加速...

  • 自定义 Opcode

    在 FPGA 中通过扩展指令集来加速计算过程,即将某些函数以CPU指令的方式来执行。然后通过将他们用 C 语言进行...

  • Swift - 加速传感器(CoreMotion)的用法,小球加

    1、加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下: (1)实例化CMMotionManager类 ...

  • Xcode的Architecture设置?armv6、armv7

    ARM处理器指令集 苹果模拟器指令集: |指令集|分析||---|----|---||i386|针对intel通用...

  • Swift - CoreMotion

    1.加速传感器可以监听到x,y,z三个方向的加速度,步骤如下:(1)实例化CMMotionManager类(2)向...

  • 使用TensorRT集成加速TensorFlow推理

    摘要:本文讲述了TensorRT集成如何加速TensorFlow推理,以及实例演示帮助入门 NVIDIA宣布完成了...

  • 加速度传感器

    一、加速度传感器的用法 1. 获取 SensorManager 实例。 2. 通过 getDefaultSenso...

网友评论

      本文标题:C++avx256指令集加速实例

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