|
原帖由 1empress 于 2007-9-15 12:46 发表 ![]()
支持紫色
鄙视一下Prescott的顾左右而言其他
没有一点实事求是的态度
不懂就不要瞎掺乎,那个紫色要么就是不懂什么叫SSE2,要么纯粹就是无理取闹。
看看下面这段代码,也就是那个测试程序核心的计算部分。
do i=1_8,N
if(mod(i,N/100)==0) print *,i/(N/100),omp_get_thread_num()
tmp=tan(real(i,10))*tan(real(i,10)*2)
fu=fu*tmp
enddo
1. 强制使用80bit的long double类型,SSE2根本就不支持这种类型,我不知道GNU Fortran编译器如何处理这种情况,很可能会强制使用X87而不是违抗程序员的意图去降低精度
2. 核心的计算每个循环中,就是tan(x) * tan(x*2),tan(x)是直接调用gibm,编译器无法作任何改变,众所周知glibm不使用SSE2,何况参数是long double类型。
3. 每个循环中,tan(x)本身的计算量可能需要数百个周期,而只有总共三次乘法运算可能被向量化,也就是说即便编译器成功的unrolling这个循环,将乘法向量化,也只能获得不到1%的性能提高。
综上所述,我的结论是他要么就是不懂什么叫SSE2,要么目的就是要写一个不可能使用SSE,而且即便是用了SSE,性能提高也只有不到1%的程序。
当然那个紫色前者的可能性更大些,居然搞不清楚指令latency和throughput的关系,P4虽然一条SSE2指令要两个周期才能得到结果,但是却可以每个周期都issue一条SSE2指令。SSE2浮点吞吐量是X87的两倍都没搞清楚。
[ 本帖最后由 Prescott 于 2007-9-15 15:36 编辑 ] |
|