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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 950. 郁闷的出纳员(Splay树)「建议收藏」

    950. 郁闷的出纳员(Splay树)「建议收藏」OIER 公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。

    2022年8月9日
    6
  • vue/uniapp 如何让页面的 onLoad 在 onLaunch 之后执行[通俗易懂]

    app.vue里的onLaunch中如果有异步方法(比如:登录),返回结果可能会在页面的onLoad之后,但onLoad中的方法需要登录回调的结果。为了让页面的onLoad在onLaunch之后执行,解决方案:1.main.js添加代码Vue.prototype.$onLaunched=newPromise(resolve=>{Vue.prototype.$isResolve=resolve;})2.在App.vue的onLau

    2022年4月14日
    56
  • 【原创】通过 ioctl + FIONREAD 判定数据可读「建议收藏」

    【原创】通过 ioctl + FIONREAD 判定数据可读「建议收藏」【原创】通过ioctl+FIONREAD判定数据可读摩云飞 2016-05-1209:57:51 浏览470 评论0libevent ioctl FIONREAD摘要: 在排查业务bug的过程中,看到如下两种输出信息: TCP连接正常情况下,进行数据读取 14:00:38epoll_ctl(26,EPOLL_CTL_MOD,31,{EPOLLIN

    2022年7月23日
    14
  • 国外免备案服务器网站,免备案海外服务器对SEO的影响[通俗易懂]

    原标题:免备案海外服务器对SEO的影响在前期SEO工作中,我们经常选择一些国内比较特殊的路线,可以有效避免网站备案带来的麻烦。随着近年来日益严格的国际比较方案备案审查,在国内上线的网站必须申请备案。所以有些SEO人员会有这样一个疑问,使用香港主机或者海外服务器,不会文件网站对SEO有影响吗?小编建议您在国内运营的网站都备案,以免影响以后网站的运营。租用服务器哪个好?小编带你了解梦飞云。1.海外服…

    2022年4月8日
    118
  • HikariPool-1 – Thread starvation or clock leap detected与Hikari数据源配置

    HikariPool-1 – Thread starvation or clock leap detected与Hikari数据源配置2019-12-0412:10:51.494WARN14480—[l-1housekeeper]com.zaxxer.hikari.pool.HikariPool:HikariPool-1-Threadstarvationorclockleapdetected(housekeeperdelta=7m48s317ms362µs591ns)….

    2022年6月23日
    481
  • .NET中pdb文件的作用是什么「建议收藏」

    .NET中pdb文件的作用是什么「建议收藏」.PDB是ProgramDatabase的缩写,全称为“程序数据库”文件。我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序。目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在。 PDB文件寻路 如果我们观察VS启动调试加载模块和符号文件的过程,会发现它通常会从可执行文件或者DLL文件的相同目录中加载符号文件。这正是调试器寻找PDB文件的

    2022年5月5日
    115

发表回复

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

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