示例代码含义:记目标字符串中有多少个目标字符。
linux代码(例子)如下:

#include <iostream>
#include <x86intrin.h>
#include <fstream>
#include <chrono>using namespace std;struct StringView {const char* p;const size_t len;
};StringView FileSize(const char* fileName) {ifstream ifstr(fileName);const auto b = ifstr.tellg();ifstr.seekg(0, ios::end);const auto e = ifstr.tellg();const size_t fileSize = e - b;ifstr.seekg(0, ios::beg);char *p = new char[fileSize];ifstr.read(p, fileSize);return {p, fileSize};
}// Normal function
size_t count_c_normal(const StringView& str, const uint8_t c) {uint32_t num = 0;for (uint32_t i = 0; i < str.len; ++i) {if (c == *(str.p + i)) {++num;}}return num;
}// SIMD function
size_t count_c_simd(const StringView& str, const uint8_t c) {__m128i ch = _mm_set1_epi8(c); // char ch[16] = { c, c, ..., c }size_t cnt = 0;uint32_t i = 0;for (; i < str.len; i+=16) {// char t[16] = { (str+i)[0], (str+i)[1], ... }__m128i t = _mm_loadu_si128((__m128i *)(str.p + i));__m128i res = _mm_cmpeq_epi8(t, ch);// res[16] = { 0xFF, 0x00, 0xFF ... }unsigned mask = _mm_movemask_epi8(res);// bits[16] = 0...1101cnt += __builtin_popcount(mask);}// free cnt .for (; i < str.len; ++i) {if (c == *(str.p + i)){++cnt;}}return cnt;
}// AVX function
size_t count_c_avx256(const StringView& str, const uint8_t c) {__m256i ch = _mm256_set1_epi8(c); // char ch[16] = { c, c, ..., c }size_t cnt = 0;uint32_t i = 0;for (; i < str.len; i+=32) {// char t[16] = { (str+i)[0], (str+i)[1], ... }__m256i t = _mm256_loadu_si256((__m256i *)(str.p + i));__m256i res = _mm256_cmpeq_epi8(t, ch);// res[16] = { 0xFF, 0x00, 0xFF ... }unsigned mask = _mm256_movemask_epi8(res);// bits[16] = 0...1101cnt += __builtin_popcount(mask);}// free cnt .for (; i < str.len; ++i) {if (c == *(str.p + i)){++cnt;}}return cnt;
}int main() {const auto ret = FileSize("./test_file");size_t cnt1 = 0, cnt2 = 0, cnt3 = 0;const auto t1 = std::chrono::steady_clock::now();cnt1 = count_c_normal(ret, uint8_t('1'));const auto t2 = std::chrono::steady_clock::now();cnt2 = count_c_simd(ret, uint8_t('1'));const auto t3 = std::chrono::steady_clock::now();cnt3 = count_c_avx256(ret, uint8_t('1'));const auto t4 = std::chrono::steady_clock::now();std::cout << "cnt1:" << cnt1 << ",cnt2:" << cnt2 << ",cnt3:" << cnt3 << std::endl;const auto d1 = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();const auto d2 = std::chrono::duration_cast<std::chrono::milliseconds>(t3-t2).count();const auto d3 = std::chrono::duration_cast<std::chrono::milliseconds>(t4-t3).count();std::cout << "time1:" << d1 << ",time2:" << d2 << ",time3:" << d3 << std::endl;return 0;
}

生成随机文件代码详见:https://blog.csdn.net/weixin_41644391/article/details/113526563

编译命令:g++ -std=c++11 main.cc -o main -mavx -mavx2 -O2
性能:

普通O2:1890ms,simd:509ms,avx2:253ms

因为编译命令中加了avx2,怀疑simd的代码也被avx2优化了。纯simd结果可见:https://blog.csdn.net/weixin_41644391/article/details/113526563

其他:基于avx512的测试因为不支持gcc4.8.5,所以需要等一段时间才能出来。

c++ SIMD AVX2比较 例子相关推荐

  1. Intel SIMD: AVX2

    AVX2 资料: Intel 内部指令 - AVX和AVX2学习笔记 Intel Intrinsics - AVX & AVX2 Learning Notes Module x86 AVX 向 ...

  2. 并行与分布式复习笔记

    mulu 链表操作与分析 MPI常用的API与应用 Pthreads常用的API及其应用.互斥锁.忙等待(自旋锁)的实现与应用 OpenMP常用的编译指令及其子句应用 课本典型案例:矩阵向量乘.曲边梯 ...

  3. 探索.NET平台中的SIMD内在函数Vector

    概述 Vector(向量)是一种序列式容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界.而Vector刚好弥补了这个缺陷,它的特征是 ...

  4. SIMD via C#

    简介 TL;DR 我们为C#(准确地说是.NET Core)引入了一套全新的机制,使得C# 以后可以像C/C++ 一样直接使用intrinsic functions 来直接操作Intel CPU 的大 ...

  5. AVX2浮点向量运算

    在C/C++程序中,使用AVX2指令有很多种方法. 嵌入汇编是一般的方法,但是对于不熟悉汇编语言的人来说,有点勉为其难. gcc编译支持AVX2指令的编程.程序中需要使用头文件<immintri ...

  6. AVX2整数向量运算

    在C/C++程序中,使用AVX2指令有很多种方法. 嵌入汇编是一般的方法,但是对于不熟悉汇编语言的人来说,有点勉为其难. gcc编译支持AVX2指令的编程.程序中需要使用头文件<immintri ...

  7. ARM_NEON_CNN编程 SIMD单指令多数据流 intrinsics指令 内联汇编 CNN卷积网络优化 深度学习优化

    ARM_NEON_CNN编程 SIMD单指令多数据流 intrinsics指令 内联汇编 CNN卷积网络优化 深度学习优化 博文末尾支持二维码赞赏哦 _ 本文github 神经网络arm neon加速 ...

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

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

  9. OpenCV算法加速(2)使用SIMD指令集(MMX、SSE、AVX)和MIPP实现视觉算法优化

    一.概述 很多人觉得OpenCV速度比较慢,其实提升OpenCV运行速度,最常见的就是重新编译OpenCV,添加各种指令集优化支持. SIMD(Single Instruction Multiple ...

  10. C++ SIMD入门

    Intel SIMD入门 我前些日子优化一个程序,需要使用C++的SIMD.我查阅了很多资料,很多说的都不详细,遇到了很多问题,踩了很多坑,心灵很受伤.为了总结一下前些日子的学习情况,让后面需要学习S ...

最新文章

  1. 人工智能是人性的罗夏测试
  2. 微软亚研院副院长周明:从语言智能到代码智能
  3. scikit-learn algorithm cheat sheet【汉化版】
  4. junit4 单元测试框架_超越JUnit –测试框架的替代方案
  5. 中专考的计算机一级b有用吗,白城计算机一级B资格证真实可查么
  6. R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)
  7. visual studio怎么编译python_我的计算机上的Python使用哪个版本的Visual Studio进行编译?...
  8. Android P新特性
  9. ANSYS 闪退问题解决办法
  10. python主成分分析_Python主成分分析-经典案例分析
  11. 一个星期内怎样学会微信公众号运营?
  12. 基于bim技术的应用软件有?哪些提高bim工作效率的revit插件
  13. css3之[2D转化,动画,3D转化] 彩蛋之3D立方体
  14. matlab仿真超声波测距,汽车倒车雷达的Simulink仿真测试
  15. Unity—对话系统GalGame游戏文字对话制作
  16. 《推荐系统实战》读书笔记
  17. 动态批量初始化CLOB字段
  18. STM32 HAL库实现编码器测速
  19. java程序设计教程_第6章_第6章 习题答案
  20. 2019湖南大学计算机考研分数线,湖南大学2019年考研分数线湖大复试过线多少分...

热门文章

  1. 计算机专业理论试题答案最新,2017年计算机一级考试题库及答案
  2. 使用golang实现对请求签名和验签
  3. 遗传算法与TSP问题
  4. Java开发之HTTP协议详解
  5. 条码电子秤商品怎么录入?
  6. 征途猎魔mysql数据库_字典列表的拓展理解
  7. 网络工程师和网络运维工程师的区别
  8. ROS配置ipv6方法
  9. Junglescout 正版账号共享 亚马逊卖家选品必备软件 junglescout插件同步升级
  10. 高校邦HTML5,高校邦视频自动播放器