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


相关推荐

  • iPhone4s完美越狱_苹果4越狱工具

    iPhone4s完美越狱_苹果4越狱工具通常我们所说iPhone激活成功教程实际上包含了很多内容在里面,激活成功教程的目的有很多,例如使用第三方软件,可以打电话,可以使用YouTube等等,其最终目的是可以实现所有的功能。在整个过程中的任何一步都可以叫做是激活成功教程,所以如果有网友单纯问如何激活成功教程这类问题实际上是很难回答的,因为不知道网友关心的是针对哪一部分的激活成功教程。因此本教程中凡是用到激活成功教程这个词的地方,都泛指各种激活成功教程方法,而对于特定的激活成功教程目的则用专门的词来描述…

    2022年9月20日
  • NOIP-铺地毯_zamani地毯

    NOIP-铺地毯_zamani地毯NOIP-铺地毯

    2022年4月21日
  • 解决ubuntu16.04中codeblocks中文显示不全的问题[通俗易懂]

    解决ubuntu16.04中codeblocks中文显示不全的问题[通俗易懂]ubuntu16.04中安装中文库、中文输入法、搜狗输入法、解决终端无法显示中文的问题、安装字体(YaheiConsolas字体)、更换漂亮绚丽flatbulous主题。codeblock设置字体为:kacstdigital或centuryschoolbookl解决中文注释显示不全的问题,修改codeblocks丑陋的运行窗口为ubuntu16.04默认的终端。

    2022年7月26日
  • 2012年考博英语参考书大比拼,华慧考博新东方占前三甲[通俗易懂]

    2012年考博英语参考书大比拼,华慧考博新东方占前三甲[通俗易懂]伴随着早几年的考研热,不少硕士毕业生又将读博纳入了计划。2010年、2011年全国博士招收人数已经突破5.5万人,博士生招生院校和单位的考试标准也趋规范,这无疑对准备2012年考博的学员提出了新的要求。目前,不论报考哪个招生单位,英语都是重点考查科目。但我国博士生入学英语考试

    2022年9月4日
  • Scala 中 fastjson Object转JsonObject

    Scala 中 fastjson Object转JsonObjectScala中,fastjson的Object转JsonObject相比于Java有些差别,不支持像Java一样强转。//java中Object转JsonObjectJSONObjectjsonObject=(JSONObject)JSON.toJSON(eventBean);导包<!–阿里巴巴开源json解析框架–><dep…

    2022年5月3日
  • P2P学习(三)网络传输基本知识

    P2P学习(三)网络传输基本知识一:NAT(NetworkAddressTranslator)P2P技术详解(一):NAT详解——详细原理、P2P简介NAT的四种类型二:STUN(SimpleTraversalof

    2022年7月1日

发表回复

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

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