intel提供了多种寄存器和指令来支持单指令多数据(simd)操作,按时间先后顺序包括MMX系列(支持64位寄存器),SSE系列(支持128位寄存器),AVX系列(支持256位寄存器)和AVX-512系列(支持512位寄存器)。本文以AVX系列的寄存器和指令位例子,分析GCC编译其中如何以intrinsic函数的形式来为程序开发者提供simd操作的支持。
数据类型
512位寄存器的数据类型主要分为两类:一类是以“__v”开头的内部类型,用以实现intrinsic函数;另一类是以“__m”开头的数据类型,是前一种类型的别名。这两种类型都定义为32个字节长度,avxintrin.h文件中有如下定义。
typedef double __v4df __attribute__ ((__vector_size__ (32)));
typedef float __m256 __attribute__ ((__vector_size__ (32), __may_alias__));
其定义是通过vector_size关键字,定义了一个长度为32字节的属性。vector_size是一个