在看了刘文志的《并行编程方法与优化实践》后决定写一写书中的例子或者实际工程中用到加速的一些sample,这本书的pdf我也有,可以在下面留言,我发给你。

1. 使用SSE指令实现了一些简单函数,可以自定义事件函数测试加速比

#include "xmmintrin.h"
#include "windows.h"
#include "math.h"
#include "iostream"
using namespace std;
typedef unsigned long uL;void MultiplyWithSSE(float * a, DWORD len, float scale){ //DWORD means unsigned longDWORD nowlen = len / 4;__m128 new_scale = _mm_set_ps1(nowlen);for(DWORD i = 0; i < nowlen; i++){*(__m128*)(a + i*4) = _mm_mul_ps(*(__m128*)(a + i*4), new_scale);}
}void MultiplyWithoutSSE(float *a, DWORD len, float scale){for(DWORD i = 0; i < len; i++){a[i] *= scale;}
}void AddWithSSE(float *a, DWORD len, float add){DWORD nowlen = len / 4;__m128 new_add = _mm_set_ps1(nowlen);for(DWORD i = 0; i < nowlen; i++){*(__m128*)(a + i*4) = _mm_add_pd(*(__m128*)(a + i*4), new_add);}
}void AddWithoutSSE(float *a, DWORD len, float add){for(DWORD i = 0; i < len; i++){a[i] += add;}
}void SqrtWithSSE(float *a, DWORD len, float scale){DWORD nowlen = len / 4;__m128 new_add = _mm_set_ps1(nowlen);for(DWORD i = 0; i < nowlen; i++){*(__m128*)(a + i*4) = _mm_sqrt_pd(scale);}
}void SqrtWithoutSSE(float *a, DWORD len, float scale){for(DWORD i = 0; i < len; i++){a[i] = sqrt(scale);}
}void MinWithSSE(float *a, DWORD len, float scale){DWORD nowlen = len / 4;__m128 new_min = _mm_set_ps1(nowlen);for(DWORD i = 0; i < nowlen; i++){*(__m128*)(a + i*4) = _mm_min_pd(*(__m128*)(a + i*4), scale);}
}void MinWithoutSSE(float *a, DWORD len, float scale){for(DWORD i = 0; i < len; i++){a[i] = min(a[i], scale);}
}void MaxWithSSE(float *a, DWORD len, float scale){DWORD nowlen = len / 4;__m128 new_max = _mm_set_ps1(nowlen);for(DWORD i = 0; i < nowlen; i++){*(__m128*)(a + i*4) = _mm_max_pd(*(__m128*)(a + i*4), scale);}
}void MaxWithoutSSE(float *a, DWORD len, float scale){for(DWORD i = 0; i < len; i++){a[i] = max(a[i], scale);}
}void Add2WithSSE(float *a, DWORD len, float scale){DWORD nowlen = len / 4;__m128 new_and = _mm_set_ps1(nowlen);for(DWORD i = 0; i < nowlen; i++){*(__m128*)(a + i*4) = _mm_add_ps(*(__m128*)(a + i*4), scale);}
}void Add2WithoutSSE(float *a, DWORD len, float scale){for(DWORD i = 0; i < len; i++){a[i]  = (int) a[i] & (int) scale;}
}int main(){
}

2. 积分计算圆周率PI

#include "avxintrin.h"
#include "windows.h"
#include "math.h"
#include "time.h"
#include "iostream"
using namespace std;
typedef unsigned long uL;//cal PI
double calPI(size_t dt){double pi = 0;double delta = 1.0 / delta;for(size_t i = 0; i < dt; i++){double x = (double) i / dt;pi += delta / (1.0 + x * x);}return pi * 4.0;
}//cal PI with AVX
double calPIWithAVX(size_t dt){double pi = 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))); //_attribute__((aligned(n)))// 此属性指定了指定类型的变量的最小对齐(以字节为单位)。// 如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。_mm256_store_pd(tmp, ymm4); //对齐存储pi += tmp[0] + tmp[1] + tmp[2] + tmp[3];return pi * 4.0;
}//cal PI with AVX and LOOP EXPANSION
double calPIWITHAVX2(size_t dt){double pi = 0;double delta = 1.0 / dt;__m256d ymm0, ymm1, ymm2, ymm3, ymm4, ymm5, ymm6, temp;ymm0 = _mm256_set1_pd(1.0);ymm1 = _mm256_set1_pd(delta);ymm2 = _mm256_set_pd(delta*3, delta*2, delta, 0.0);temp = _mm256_set_pd(delta*7, delta*6, delta*5, delta*4);ymm4 = _mm256_setzero_pd();ymm5 = _mm256_setzero_pd();for(int i = 0; i <= dt - 8; i += 8){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);ymm6 = _mm256_set1_pd((i+4) * delta);ymm6 = _mm256_mul_pd(ymm6, temp);ymm6 = _mm256_add_pd(ymm0, ymm6);ymm6 = _mm256_div_pd(ymm1, ymm6);ymm5 = _mm256_add_pd(ymm5, ymm6);}ymm4 = _mm256_add_pd(ymm4, ymm5);double tmp[4] __attribute__((aligned(32))); //_attribute__((aligned(n)))// 此属性指定了指定类型的变量的最小对齐(以字节为单位)。// 如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。_mm256_store_pd(tmp, ymm4); //对齐存储pi += tmp[0] + tmp[1] + tmp[2] + tmp[3];return pi * 4.0;
}int main(){clock_t st = clock();calPI(1000000000);clock_t en = clock();double t = (double)(en - st) / CLOCKS_PER_SEC;printf("%.5f\n", t);st = clock();calPIWithAVX(10000000000);en = clock();t = (double)(en - st) / CLOCKS_PER_SEC;printf("%.5f\n", t);st = clock();calPIWITHAVX2(10000000000);en = clock();t = (double)(en - st) / CLOCKS_PER_SEC;printf("%.5f\n", t);return 0;
}

X86 SSE/AVX指令集加速学习相关推荐

  1. SSE/AVX指令集学习笔记

    ​ 因为最近在做SSE/AVX指令集优化视频编码的某些模块,所以要学习SSE指令集的用法.本帖主要记录本人用到的函数的用法. 一.SSE指令(128位寄存器) __m128i _mm_load_si1 ...

  2. AVX指令集加速矩阵乘法

    AVX简介 SIMD SIMD(Single Instruction Multiple Data,单指令多数据流),是一种实现空间上的并行性的技术.这种技术使用一个控制器控制多个处理单元,同时对一组数 ...

  3. 一文读懂SIMD指令集 目前最全SSE/AVX介绍

    SIMD指令集 SSE/AVX 概述 参考手册 Intel® Intrinsics Guide Tommesani.com Docs Intel® 64 and IA-32 Architectures ...

  4. [C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)...

    作者:zyl910. 本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE.AVX指令集.因使用了stdint.zintrin.ccpuid这三个模块, ...

  5. TensorFlow CPU环境 SSE/AVX/FMA 指令集编译

    TensorFlow CPU环境 SSE/AVX/FMA 指令集编译 sess.run()出现如下Warning W tensorflow/core/platform/cpu_feature_guar ...

  6. opencv cpu指令集SSE/AVX

    SSE与AVX指令集 SSE指令集是英特尔提供的基于SIMD(单指令多数据,也就是说同一时间内,对多个不同的数据执行同一条命令)的硬件加速指令,通过使用寄存器来进行并行加速.经过几代的迭代,最新的SS ...

  7. SIMD、SSE、AVX指令集

    指令集 指令集是指CPU能执行的所有指令的集合,每一指令对应一种操作,任何程序最终要编译成一条条指令才能让CPU识别并执行.CPU依靠指令来计算和控制系统,所以指令强弱是衡量CPU性能的重要指标,指令 ...

  8. c/c++ 代码中使用sse指令集加速

    使用SSE指令,首先要了解这一类用于进行初始化加载数据以及将暂存器的数据保存到内存相关的指令, 我们知道,大多数SSE指令是使用的xmm0到xmm8的暂存器,那么使用之前,就需要将数据从内存加载到这些 ...

  9. 单指令多数据SIMD的SSE/AVX指令集和API

    https://software.intel.com/sites/landingpage/IntrinsicsGuide/# Technologies MMX SSE SSE2 SSE3 SSSE3 ...

最新文章

  1. 如何给上传控件上色【HOW TO SET CSS FOR THE CONTROL OF FILEUPLOAD】
  2. 比特币现金诞生一周年,BCH的未来在哪?
  3. bigdecimal类型数据的min方法
  4. 选项卡 都是显示在页面底部
  5. 微课竞赛系统的设计与实现所需工作条件_工作室文化建设展示(3)
  6. 使用timeit测试Python函数的性能
  7. 垂直margin合并问题
  8. 安装软件要求输入服务器配置信息,信息技术考试软件配置安装与操作规范(管理服务端与客户端)(30页)-原创力文档...
  9. vue打卡日历_Vue日历
  10. Nginx handler模块
  11. 我手机计算机屏幕是黑色的,教你处理手机或者电脑黑屏的简单方法
  12. Linux计算节点怎么关闭,OpenStack 删除无用的计算结点
  13. 如何进行SEO站内优化,让你的网站更易被搜索引擎收录
  14. latex中文小标题_LaTeX标题怎样使用中文?
  15. textarea回车换行的方法
  16. JQuery插件让图片旋转任意角度且代码极其简单
  17. 推荐一个临时邮箱生成网站,专门用于各种注册用途
  18. 设计模式(二)抽象工厂模式
  19. 从零手写移动机器人URDF模型学习记录(一)
  20. jason-2影像下载

热门文章

  1. 基于代理模式的接口调用示例
  2. Provisioning Services 7.8 入门系列教程之五 使用Provisioning Services控制台
  3. C语言利用结构体判断年月日
  4. 年少不懂王小波,读懂已是猪圈人!做一只特立独行的猪
  5. #单目视觉振动位移测量方法
  6. 计算机 服务未能登陆,w7电脑开机提示Group Policy Client服务未能登陆的修复方法...
  7. SICK OD2位移测量传感器单双张检测调试实例
  8. 学生管理。。。。...
  9. 通信网络中的数据透传
  10. size mismatch for yolo_head2.1.bias: copying a param with shape torch.Size(【75】) from checkpoint...