AVX2 初探

AVX2 初探Intel最近发布了AVX-512,据说对浮点运算有很大提升,我的机器目前不支持AVX-512,但是支持AVX2,按照之前Intel给出的数据,据说能提速将近8倍:IntroductiontoIntel®AdvancedVectorExtensions测试环境可能这篇文章有点偏老,我这边也想验证一下没有优化的C/C++浮点运算和AVX2优化后的浮点运算到底快多少。这是我机器的配置:Manufacturer GenuineIntelName IntelCorei77820

大家好,又见面了,我是你们的朋友全栈君。

Intel最近 发布了AVX-512,据说对浮点运算有很大提升,我的机器目前不支持AVX-512,但是支持AVX2,按照之前Intel给出的数据,据说能提速将近8倍:
Introduction to Intel® Advanced Vector Extensions
在这里插入图片描述

测试环境

可能这篇文章有点偏老,我这边也想验证一下没有优化的C/C++浮点运算和AVX2优化后的浮点运算到底快多少。这是我机器的配置:

Manufacturer GenuineIntel
Name Intel Core i7 7820HQ
Codename Kaby Lake
Specification Intel® Core™ i7-7820HQ CPU @ 2.90GHz
Max frequency 3900 MHz
Instructions sets MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, EM64T, VT-x, AES, AVX, AVX2, FMA3, TSX

测试代码

我用的编译器是VS2017,这是对应的测试代码 :

#include <stdio.h>
#include <immintrin.h>
#include <random>
#include <chrono>

#define NUM_FLOATS 102400000

int main()
{ 
   
	// At first, prepare 2 float arrays
	float* fas = new float[NUM_FLOATS];
	float* fbs = new float[NUM_FLOATS];
	float* fcs = new float[NUM_FLOATS];

	std::random_device rd;
	std::mt19937 gen(rd());
	std::uniform_real_distribution<float> dis(-1.0f, 1.0f);

	for (int i = 0; i < NUM_FLOATS; i++)
	{ 
   
		fas[i] = dis(gen);
		fbs[i] = dis(gen);
	}

	// Begin to do the AVX operation
	__m256 ymm0, ymm1;

	auto tp0 = std::chrono::high_resolution_clock::now();

#if 0
	for (int i = 0; i < NUM_FLOATS / 8; i++)
	{ 
   
		ymm0 = _mm256_loadu_ps(fas + (i << 3));
		ymm1 = _mm256_loadu_ps(fbs + (i << 3));

		ymm0 = _mm256_mul_ps(ymm0, ymm1);

		_mm256_storeu_ps(fcs + (i << 3), ymm0);
	}

#else
	for (int i = 0; i < NUM_FLOATS; i++)
	{ 
   
		fcs[i] = fas[i] * fbs[i];
	}
#endif

	// Finish doing the AVX operation

	auto tp1 = std::chrono::high_resolution_clock::now();

	printf("It takes %lld msec to finish %d round of float multiply.\n",
		std::chrono::duration_cast<std::chrono::milliseconds>(tp1 - tp0).count(), NUM_FLOATS);

	for (int i = 0; i < 10; i++)
	{ 
   
		printf("%f*%f = %f\n", fas[i], fbs[i], fcs[i]);
	}

	delete[] fas;
	delete[] fbs;
	delete[] fcs;

	return -1;
}

中间有一个条件编译模块,可以在AVX2和C/C++之间做切换,我随机选了102,400,000(一亿个单精度浮点数字左右)进行乘法运算。

测试结果

这是对应的测试结果:

C/C++代码 AVX2代码
不使用缺省编译器优化 第一次:347ms
第二次:298ms
第三次:296ms
第一次:154ms
第二次:153ms
第三次:151ms
使用缺省编译器优化 第一次:120ms
第二次:119ms
第三次:117ms
第一次:116ms
第二次:119ms
第三次:162ms

结论

可以看出来, VS2017对浮点有做比较好的优化,估计我测试的这种场景比较简单,编译器对这种情况做了很好的优化,基本上和自己用AVX指令写出来的性能差不多。
如果不用编译器优化,这个时候,AVX2大概比普通的C/C++浮点运算代码快2倍左右,不像宣传的那样厉害嘛。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139128.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 修正Thinkphp 3.2 分页Page类以支持URL路由

    修正Thinkphp 3.2 分页Page类以支持URL路由

    2021年10月28日
    32
  • 半小时一篇文过完C语言基础知识点[通俗易懂]

    半小时一篇文过完C语言基础知识点[通俗易懂]本文定位读者为小白读者,将使用最快的方法学完C语言,并且制作一个学生管理系统。由于是速成的方法,本文不会描述过多的其它知识,大部分知识点只是描述了如何进行使用,如何深入还需要各位努力;不过学习过了一遍内容后,学习起来也会较为容易。环境:系统:windows7IDE:Devc面向读者:小白一、HelloWorldHelloWorld是经典的编程入门程序,指在编写代码生成程序,运行该程序将会在程序中显示HelloWorld。以下是一个HelloWorld的C语言代码:#include&

    2022年9月21日
    3
  • SpringBoot2集成Druid配置

    SpringBoot2集成Druid配置=。=补发一下这个教程,之前没时间放什么是Druid?Druid首先是Java语言中最好的数据库连接池,也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBossDataSource等等等,秒杀一切。而且Druid已经在阿里巴巴部署了超过600个应用,经…

    2022年7月23日
    11
  • 物联网之Zigbee系统开发一(zigbee简介)[通俗易懂]

    zigbee简介:无线传感网络的无线通信技术可以采用zigbee,蓝牙,wifi和红外等。ZigBee技术是一种短距离,低复杂度,低功耗,低成本,低数据速率的双向无线通信技术,是一组基于IEEE802.15.4无线标准研制开发的有组网,安全和应用软件方面的通信技术。zigbee应用范围:   智能家居-对家用电器的控制和家庭娱乐系统的管理。   楼宇自动化-整合并集中管理照…

    2022年4月8日
    93
  • C PictureBox 图片控件

    C PictureBox 图片控件图片控件中常用的属性如下表所示 图片控件中图片的设置除了可以直接使用 ImageLocatio 属性指定图片路径以外 还可以通过 Image FromFile 方法来设置 实现的代码如下 图片控件的名称 Image Image FromFile 图像的路径 实例 实现图片交换 Form1

    2025年7月7日
    1
  • LDR命令

    LDR命令  LDR指令用于从内存中将一个32位的字读取到指令中的目标寄存器中,如果目标寄存器为PC,则可以实现“长”跳转。主要有一下3种方式使用:ldrr0,_startldrr0,=_startldrpc,_start  逐条分析:一、ldrr0,_start  从内存地址_start的地方,把其对应的命令执行对应的“执行码”读入到r0中。二、ldrr0,=_start  …

    2022年6月28日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号