游戏开发论坛

 找回密码
 立即注册
搜索
楼主: fromhell

跪求高手指导sse

[复制链接]

3

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2004-5-6 21:15:00 | 显示全部楼层

Re:跪求高手指导sse

CPU都是他们做的,这个优化当然是他最拿手了^_^

"向量化"是什么意思啊,不好意思,才疏学浅

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-5-6 22:52:00 | 显示全部楼层

Re: Re:跪求高手指导sse

dandyboy: Re:跪求高手指导sse

CPU都是他们做的,这个优化当然是他最拿手了^_^

"向量化"是什么意思啊,不好意思,才疏学浅

不过,编译器可是相当深刻的一门学问哦,AMD的3dNow几乎就没有编译器级别的优化(听说codeplay可以,不过没试过)ICC的优秀是业界公认的。
话说回来,Intel的P4如果不优化的话性能,尤其是浮点性能实在是太差,如果只拼x87性能的话,同频率基本是AMD K7的一半,我原来写了一个密集浮点运算的程序就是这样。而M$的编译器优化能力也很差,用VC8(.net2003)的编译器为p4优化,性能只提升了一点(大概30%-40%),而用ICC优化後性能提升了几乎150%-180%。

所谓向量化,就是利用MMX,SSE,SSE2,SSE3等指令的SIMD特性。比如以下的循环:
float a[1000], b[1000], c[1000];
for (i=0; i<1000; i++)
{
    a=b*c+sin(d);
}
经过ICC的SSE循环向量化后,就相当于下面的伪码
for (i=0; i<1000; i+=4)
{
     a[i:i+3]=b[i:i+3]*c[i:i+3]+sin(d[i:i+3]);
}
其中a[i:i+3]代表把a,a[i+1],a[i+2],a[i+3]4个FP32pack成一个128bit,然后同时计算(即SIMD)
所以说,关键就是把能够并行运算的表达式用数组+循环代替(同时避免使用全局变量并且不要忘了对齐)。
关于如何编写程序使循环容易被编译器向量化在ICC的文档中有详细描述。

尽管SSE中没有任何超越instruction(比如sin,log等)不过不用担心,ICC中存在Intel写好的一些lib可以通过一定的方式(比如泰勒展开)实现这些操作,这是使用ICC比手工编写SSE等代码最大的优点了吧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-30 19:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表