分享
 
 
 

使用Intel 向量化编译器优化性能(3)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

使用Intel 向量化编译器优化性能(3)

本文节选翻译自Intel编译器文档

1. 向量化循环中的数据类型

在整形的循环中,MMX和SSE技术都为多数使用8/16/32bits长度数据的算法和逻辑操作提供了相应的SIMD指令,如果一个使用整数的算法把结果保存在一个有足够精度的变量中,那么这个算法就可能被向量化,举例说,一个运算的结果是32位整数,但却被保存在一个16位的整数中,那么这么操作就不能被向量化,不是所有整形操作都能够被向量化的.

在32位或64位浮点数的循环中,SSE指令集不光为加减乘除等运算提供了相应的SIMD指令,而且也提供了诸如MAX/MIN/SORT这样的操作的SIMD指令,其它的一些数学运算,比如三角函数SIN/COS/TAN的SIMD版本也已经在和编译器一起提供的向量数学库中得到了支持.

2. 展开循环

编译器会自动对循环进行分析,并生成展开后的代码,这就是说你不需要自己去展开循环重新编写循环操作,在很多情况下,这能够使你获得更多的向量化操作.

看下面的循环

int i = 0;

while(i < k)

{

a[i] = b[i] + c[i];

++i;

}

向量化后就生成这样2个循环操作

while(i < (k - k % 4))

{

a[i] = b[i] + c[i];

a[i + 1] = b[i + 1] + c[i + 1];

a[i + 2] = b[i + 2] + c[i + 2];

a[i + 3] = b[i + 3] + c[i + 3];

i+=4;

}

while(i < k)

{

a[i] = b[i] + c[i];

++i; <-此处文档上遗漏,很显然缺少这行程序很可能会陷入死循环

}

3. 循环中的语句

整数和浮点数间的向量化操作是不同的.

a) 浮点数组操作

支持的算法包括加/减/乘/除/非/平方根/求最大值/求最小值,在P4处理器还可以使用双精度的运算,前提是编译时使用-QxW或-QaxW打开对P4的优化.

b) 整数数组操作

在包含8/16/32位整形数据的循环中,计算平方根(sqrt)和浮点数绝对值(fabs)这样的运算也是可以支持的,像加/减/乘(16位)/除(16位)/and/or/xor/max/min这些运算在一定条件下也是支持的,你可以在运算中使用多种数据类型只要结果不丢失数据,就是说结果不能超过32bits发生溢出.

c) 其它操作

任何超出整数和浮点数精度范围的语句都是不能向量化的,那些特殊的如__m64和__m128这样类型的数据也不能被向量化,循环中不能有任何函数调用(注:void fun(void)这样的是可以的J),也不能够使用SSE SDK的Intrinsics库(这里意思不确定,原文是Use of the Streaming SIMD Extensions Intrinsics(_mm_add_ps) are not allowed ).

4. 语言支持和控制指令

一些控制指令可以更好的帮助你向量化你的代码.

__declspec(align(n))

使你的编译器把变量的地址对齐n字节,就是说变量的地址 mod n =0

__declspec(align(n,off))

使你的编译器把变量的地址对齐n字节+offset,就是说变量的地址 mod n = off

restrict

使编译器认为没有指针别名,可以更容易向量化你的代码

__assume_aligned(a,n)

如果编译器没能字节对齐的信息,用这个让编译器假设数组a使按n对齐的

#pragma ivdep

让编译器假设你的代码没有数据依赖

#pragma vector

{aligned | unaligned | always}

指定如何向量化这个循环并忽略效率推测

#pragma novector

不要向量化这个循环

5. 一些向量化循环的例子

a) 有别名问题的循环

下面的例子是个向量复制的操作

void vec_copy (int* p1,int* p2)

{

for (i = 0; i < 100; ++i)

{

p1[i] = p2[i];

}

}

这里因为编译器能清楚的分别两个指针,所以可以被向量化.

又有个例子

void vec_copy (int* restrict p1,int* restrict p2)

{

for (i = 0; i < 100; ++i)

{

p1[i] = p2[i];

}

}

和上一个例子同样可以被向量化,但是用了restrict,所以编译器不用产生多个版本的代码,注意,用restrict编译时要加/Qrestrict参数

6. 数据对齐

一个16字节或更大的数据结构或数组应该是对齐的,所以这些结构和数据的基地址应该是16的倍数,下图说明了一个DCU(data cache unit)是如何分割一个没有对齐16字节的数据.

在访问这个数据的时候需要多花费6-12时钟周期,如果你能把数据对齐就可以避免这些额外的性能开销

举例说明

float *a,*b;

for (i = 0; i < 10; ++i)

{

a[i] = b[i];

}

如果a[0]/b[0]都是16字节对齐的,那么这个循环就可以使用#pragma vector aligned这个指令,在向量化后就是这样执行的.

2次向量化迭代 2次循环

ß------------------------à ß------->

i=0-3,i=4-7 i=8-9

2次向量化迭代可以用块复制的方式来操作.

注意,如果向量化使用不正确的对齐指令,编译器会产生不可预见的行为,比如在未对齐的的数据上使用#pragma vector aligned将会导致一个异常.

这是几个关于数据对齐的例子

void f(int lb)

{

float z2[N],a2[N],y2[N],x2;

for (i = lb; i < N; ++i)

{

a2[i] = a2[i] * x2 + y2[i];

}

}

因为无法在编译时去确定lb,所以我们只能认为这里没有做到对齐,如果你确定lb时4的倍数,那么你就可以使用#pragma vector aligned.

void f(int lb)

{

float z2[N],a2[N],y2[N],x2;

assert(lb % 4 = 0);

#pragma vector aligned

for (i = lb; i < N; ++i)

{

a2[i] = a2[i] * x2 + y2[i];

}

}

全文完,谢谢大家的支持.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有