gcc __attribute__ (vector_size)

本文机翻自:https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html ,如果下面有看了有不太清楚的地方,还请查看原文!

在一些目标上,指令集包含了SIMD向量指令,这些指令同时对一个大寄存器中的多个值进行操作。例如,在x86上,MMX、3DNow! 和SSE扩展可以用这种方式使用。

使用这些扩展的第一步是提供必要的数据类型。这应该使用一个适当的类型定义来完成。

typedef int v4si __attribute__ ((vector_size (16)));

int类型指定了基本类型,而attribute(属性)则指定了变量的向量大小,单位为字节。例如,上面的声明使编译器将v4si类型的模式设置为16字节宽,并划分为int大小的单元。对于一个32位的int来说,这意味着一个由4个单元组成的4字节的向量,相应的foo的模式是V4SI。

vector_size属性只适用于整型和浮点型标量,尽管数组、指针和函数返回值都允许与此结构结合使用。目前取值只允许为基本类型大小的2次方倍数。

所有基本的整数类型都可以作为基类型使用,包括有符号和无符号类型:char、short、int、long、long long。此外,float和double可以用来建立浮点向量类型。

指定一个对当前架构无效的组合会导致GCC使用narrower模式合成指令。例如,如果你指定一个V4SI类型的变量,而你的架构不允许这种特定的SIMD类型,GCC就会产生使用4个SI的代码。

以这种方式定义的类型可以用于正常C语言操作的一个子集。目前,GCC允许在这些类型上使用以下运算符:+, -, *, /, unary minus, ^, |, &, ~, %。

这些操作的行为类似于C++的valarrays(值数)。加法被定义为操作数中相应元素的相加。例如,在下面的代码中,a中的4个元素与b中相应的4个元素相加,所得的向量被存储在c中。

typedef int v4si __attribute__ ((vector_size (16)));

v4si a, b, c;

c = a + b;

减法、乘法、除法和逻辑运算的操作方式类似。同样,在一个向量类型上使用单数减或complement(补位)运算符的结果是一个向量,其元素是操作数中相应元素的负值或补值。

可以在整数型向量上使用移位运算符<<, >>。该操作的定义如下。{a0, a1, …, an}. >> {b0, b1, …, bn} == {a0 >> b0, a1 >> b1, …, an >> bn}。矢量操作数必须有相同数量的元素。

为了方便起见,允许使用一个操作数是标量的二进制向量操作。在这种情况下,编译器会将标量操作数转换成一个向量,其中每个元素都是操作中的标量。只有当标量可以被安全地转换为向量元素类型时,才会发生这种转换。参考一下下面的代码。

typedef int v4si __attribute__ ((vector_size (16)));

v4si a, b, c;
long l;

a = b + 1;    /* a = b + {1,1,1,1}; */
a = 2 * b;    /* a = {2,2,2,2} * b; */

a = l + a;    /* Error, cannot convert long to int. */

向量可以使用下标,就像向量是一个具有相同元素数量和基本类型的数组一样。超出边界的访问会在运行时调用未定义的行为。可以用-Warray-bounds启用对向量越界访问的警告。

向量比较支持标准的比较运算符。==, !=, <, <=, >, >=. 比较操作数可以是整数型或实数型的向量表达式。不支持整数型向量和实数型向量之间的比较。比较的结果是一个宽度和元素数与比较操作数相同的向量,其元素类型为带符号的整型。

向量是按元素比较的,当比较为假时产生0,否则产生-1(适当类型的常数,所有位都被设置)。请看下面的例子。

typedef int v4si __attribute__ ((vector_size (16)));

v4si a = {1,2,3,4};
v4si b = {3,2,1,4};
v4si c;

c = a >  b;     /* The result would be {0, 0,-1, 0}  */
c = a == b;     /* The result would be {0,-1, 0,-1}  */

未完,但是已经解决了我关于vector_size的疑惑!

posted @   streamlet_hy  阅读(507)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示