C/C++相关知识点随记(持续更新)

个人在C/C++程序中的一些语法小结

一.一些比较习惯的用法

1.C++编程中,如下情况,表示对无符号数0按位取反后右移一位,若在在32系统中,就是将来32位的0取反后右移一位的值赋给inf

const int inf = ~0u>>1

详细说明:

~ 逐位求反

u 后辍为 定义unsigned类型

>>右移

2.如下表示无符号长整数常量1,用16进制表示

0x1ul

后缀u代表无符号数

后缀l代表长型数

这三个标记都不区分大小写



二.关于指令集

#include <immintrin.h>  //immintrin.h     Intel-specific intrinsics(AVX)

引入因特尔指令集

Intrinsics头文件与SIMD指令集、Visual Studio版本对应表(转)

File:Intrinsics头文件

描述:指令集描述
VS:Visual Studio版本号
VisualStudio:Visual Studio版本名

File 描述 VS VisualStudio
intrin.h All Architectures 8.0 2005
mmintrin.h MMX intrinsics 6.0 6.0 SP5+PP5
xmmintrin.h Streaming SIMD Extensions intrinsics 6.0 6.0 SP5+PP5
emmintrin.h Willamette New Instruction intrinsics (SSE2) 6.0 6.0 SP5+PP5
pmmintrin.h SSE3 intrinsics 9.0 2008
tmmintrin.h SSE3 intrinsics 9.0 2008
smmintrin.h SSE4.1 intrinsics 9.0 2008
nmmintrin.h SSE4.2 intrinsics. 9.0 2008
wmmintrin.h AES and PCLMULQDQ intrinsics. 10.0 2010
immintrin.h Intel-specific intrinsics(AVX) 10.0 2010 SP1
ammintrin.h AMD-specific intrinsics (FMA4, LWP, XOP) 10.0 2010 SP1
mm3dnow.h AMD 3DNow! intrinsics 6.0 6.0 SP5+PP5

armintr.h:ARM的常用指令集。
arm_neon.h:ARM的neon指令集。

intrin.h中以前大段的ARM Intrinsics被移到armintr.h中去了,现在的intrin.h只需引入armintr.h(拥有_M_ARM宏时)。

但是intrin.h并没有引入arm_neon.h。搜索了一下其他头文件,也没有引入arm_neon.h。看来不会自动引入,需要开发者根据情况手动引入arm_neon.h。

又对比了一下原来就有Intrinsics头文件,发现两个文件增加了新的Intrinsics函数集——
immintrin.h:F16C、RDRAND、FSGSBASE、FMA、AVX2、BMI1、BMI2、LZCNT、INVPCID、HLE、RTM。
ammintrin.h:BMI1、TBM。

指令简介——
F16C、RDRAND、FSGSBASE:这些是Ivy Bridge架构的新指令。
FMA、AVX2、BMI1、BMI2、INVPCID、HLE、RTM:这些是Haswell架构的新指令。
LZCNT:AMD的ABM指令集,现在Intel对其支持。以前intrin.h有一个双下划线版的,现在immintrin.h提供单下划线版。
TBM:AMD的TBM指令集。

Haswell架构在2013年第二季度才发售,VC2012已提前做好准备。

SSE是指令集的简称,它包括70条指令,其中包含单指令多数据浮点计算、以及额外的SIMD整数和高速缓存控制指令。其优势包括:更高分辨率的图像浏览和处理、高质量音频、MPEG2视频、同时MPEG2加解密;语音识别占用更少CPU资源;更高精度和更快响应速度。SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是MMX的超集。AMD后来在Athlon XP中加入了对这个指令集的支持。这个指令集增加了对8个128位寄存器XMM0-XMM7的支持,每个寄存器可以存储4个单精度浮点数。使用这些寄存器的程序必须使用FXSAVE和FXRSTR指令来保持和恢复状态。但是在Pentium III对SSE的实现中,浮点数寄存器又一次被新的指令集占用了,但是这一次切换运算模式不是必要的了,只是SSE和浮点数指令不能同时进入CPU的处理线而已。

AVX指令集是Sandy Bridge和Larrabee架构下的新指令集。AVX是在之前的128bit扩展到和256bit的SIMD(Single Instruction, Multiple Data)。而Sandy Bridge的SIMD演算单元扩展到256bits的同时数据传输也获得了提升,所以从理论上看CPU内核浮点运算性能提升到了2倍。




猜你喜欢

转载自blog.csdn.net/u011795345/article/details/78820703
今日推荐