POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
123
返回列表 发新帖
楼主: CC9K
打印 上一主题 下一主题

INTEL:新处理器快过CELL 5000倍,下代游戏主机无须手柄

[复制链接]
41#
发表于 2007-12-19 16:03 | 只看该作者
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <sys/time.h>


  4. int main()
  5. {
  6.     struct timeval tv1, tv2;
  7.     int timediff;
  8.     int i;
  9.     double x = 0.0,tmp;
  10.     gettimeofday(&tv1, NULL);
  11.     for(i=1;i<20000000;i++){
  12.         tmp = sin(i);
  13.         x += tmp;
  14.     }
  15.     gettimeofday(&tv2, NULL);
  16.     timediff = (tv2.tv_sec - tv1.tv_sec) * 1000000 + (tv2.tv_usec - tv1.tv_usec);
  17.     printf("sse2: x=%e, time = %dn", x, timediff);

  18.     x=0.0;
  19.     gettimeofday(&tv1, NULL);
  20.     asm("finit");
  21.     for(i=1;i<20000000;i++){
  22.         tmp = (double)i;
  23.         asm("fsin" : "=t" (tmp) : "0" (tmp));
  24.         x += tmp;
  25.     }
  26.     gettimeofday(&tv2, NULL);
  27.     timediff = (tv2.tv_sec - tv1.tv_sec) * 1000000 + (tv2.tv_usec - tv1.tv_usec);
  28.     printf("fsin: x=%e, time = %dn", x, timediff);

  29.     return 0;
  30. }

  31. [xxxxxx@xxxxxx-desk test]$ icc -O3 -xT -static sin_test2.cpp -o sin2.icc
  32. sin_test2.cpp(13): (col. 5) remark: LOOP WAS VECTORIZED.

  33. [xxxxxx@xxxxx-desk test]$ ./sin2.icc
  34. sse2: x=7.052914e-01, time = 387135
  35. fsin: x=7.052914e-01, time = 786659

  36. [xxx@xx-desk ~]$ cat /proc/cpuinfo
  37. ............
  38. model name      : Intel(R) Core(TM)2 CPU          6700  @ 2.66GHz
  39. ............
复制代码
:whistling:

[ 本帖最后由 Prescott 于 2007-12-19 16:06 编辑 ]
回复 支持 反对

使用道具 举报

42#
发表于 2007-12-19 16:27 | 只看该作者
我也跑了几遍。第一个程序确实是sse快。而我要求改的那个就反过来。
结果是这样(gfortran是必然要调用fsin的,所以使用x87或者sse运行时间几乎完全相同,已经验证):
第一个:
编译选项                         运行时间
ifort -O3 1.f90                 1.836s
ifort -O3 -xN 1.f90            1.468s
gfortran 1.f90 -O3 ...         4.240s

第二个:
ifort -O3 2.f90                 2.436s
ifort -O3 -xN 2.f90            6.280s   :funk:  ????
gfortran 2.f90 -O3 ...         1.872s

第二个怎么解释,矢量sse那么慢
回复 支持 反对

使用道具 举报

43#
发表于 2007-12-19 16:36 | 只看该作者
:funk: :funk: :funk::wacko: :wacko: :wacko:
回复 支持 反对

使用道具 举报

44#
发表于 2007-12-19 16:49 | 只看该作者
原帖由 紫色 于 2007-12-19 16:27 发表
我也跑了几遍。第一个程序确实是sse快。而我要求改的那个就反过来。
结果是这样(gfortran是必然要调用fsin的,所以使用x87或者sse运行时间几乎完全相同,已经验证):
第一个:
编译选项                        ...


sorry, 不会fortran,帖完整程序吧
回复 支持 反对

使用道具 举报

45#
发表于 2007-12-19 17:39 | 只看该作者
我的c是菜鸟水平,平时都用fortran。两个程序其实就是你的两个c程序,你一看就懂。
当然,去掉了内联汇编,因为fortran不支持那玩意。
看运行时间用time命令。

1.f90
--------------------
program test1
implicit none
integer,parameter :: N=10000000
real(kind=8) :: x=0.6333333333_8,y=0.7222222222_8
real(kind=8) :: z1,z2
integer :: i
do i=1,N
z1 = sin(x)
z2 = sin(y)
x = z1 + 1.0_8
y = z2 + 1.0_8
enddo
print *, x
end program test2


2.f90
--------------------------
program test2
implicit none
integer,parameter :: N=10000000
real(kind=8) :: x=0.0_8,tmp=0.0_8
integer :: i
do i=1,N
tmp=sin(dble(i))
x=x+tmp
enddo
print *, x
end program test2

已经很有收获了。第二种情况可能是dble花时间(程序中的dble是不可省的), 或者数据在通用寄存器与sse寄存器之间频繁交换导致延迟。我会逐一测试其他常用函数。

[ 本帖最后由 紫色 于 2007-12-19 17:47 编辑 ]
回复 支持 反对

使用道具 举报

46#
发表于 2007-12-19 17:47 | 只看该作者
  1. [xxx@xxx-desk test]$ gfortran -O3 2.f90 -o sin.gfort
  2. [xxx@xxx-desk test]$ time ./sin.gfort
  3.    1.95589140854128

  4. real    0m0.654s
  5. user    0m0.653s
  6. sys     0m0.001s
  7. [xxx@xxx-desk test]$ ifort -fast 2.f90 -o sin.ifort
  8. ipo: remark #11001: performing single-file optimizations
  9. ipo: remark #11005: generating object file /tmp/ipo_ifortVMo2Ue.o
  10. 2.f90(6): (col. 1) remark: LOOP WAS VECTORIZED.
  11. [xxx@xxx-desk test]$ time ./sin.ifort
  12.    1.95589140854105

  13. real    0m0.198s
  14. user    0m0.197s
  15. sys     0m0.001s

  16. [xxx@xxx-desk test]$ ifort --version
  17. ifort (IFORT) 10.1 20070913
  18. Copyright (C) 1985-2007 Intel Corporation.  All rights reserved.
复制代码
在我这里,E6700/EL5/ifort ver10.1.008下,ifort比gfortran快3倍多。

[ 本帖最后由 Prescott 于 2007-12-19 17:49 编辑 ]
回复 支持 反对

使用道具 举报

47#
发表于 2007-12-19 17:52 | 只看该作者
看见了。

只有core2才能跑-fast吧,
能不能分别-O3 和 -O3 -xN看看结果。

我的ifort版本更新些呢
Intel(R) Fortran Compiler for applications running on IA-32, Version 10.1    Build 20071116 Package ID: l_fc_p_10.1.011

[ 本帖最后由 紫色 于 2007-12-19 17:53 编辑 ]
回复 支持 反对

使用道具 举报

48#
发表于 2007-12-19 17:55 | 只看该作者
原帖由 紫色 于 2007-12-19 17:52 发表
看见了。

只有core2才能跑-fast吧,
能不能分别-O3 和 -O3 -xN看看结果。

我的ifort版本更新些呢
Intel(R) Fortran Compiler for applications running on IA-32, Version 10.1    Build 20071116 Package I ...
  1. [xxx@xxx-desk test]$ ifort -O3 -xW 2.f90 -o sin2.ifort
  2. 2.f90(6): (col. 1) remark: LOOP WAS VECTORIZED.
  3. [xxx@xxx-desk test]$ time ./sin2.ifort
  4.    1.95589140854105

  5. real    0m0.195s
  6. user    0m0.193s
  7. sys     0m0.002s

  8. [xxx@xxx-desk test]$ ifort -O3 2.f90 -o sin2.ifort
  9. 2.f90(6): (col. 1) remark: LOOP WAS VECTORIZED.
  10. [xxx@xxx-desk test]$ time ./sin2.ifort
  11.    1.95589140854105

  12. real    0m0.194s
  13. user    0m0.194s
  14. sys     0m0.000s
复制代码
-xW等同于-xN,新版的ifort取消了-xN。
最后的那一点点性能差别,应该是speedstep造成的,我的处理器自动降频到1.6GHz

哦,你是32位的 :lol:

[ 本帖最后由 Prescott 于 2007-12-19 18:06 编辑 ]
回复 支持 反对

使用道具 举报

49#
发表于 2007-12-19 18:01 | 只看该作者
满点高兴。把gfortran版本告诉我。按我的选项跑跑看,时间就不是3倍了。
回复 支持 反对

使用道具 举报

50#
发表于 2007-12-19 18:04 | 只看该作者
原帖由 紫色 于 2007-12-19 18:01 发表
满点高兴。把gfortran版本告诉我。按我的选项跑跑看,时间就不是3倍了。
  1. [xxx@xxx-desk test]$ ifort --version
  2. ifort (IFORT) 10.1 20070913
  3. Copyright (C) 1985-2007 Intel Corporation.  All rights reserved.

  4. [xxx@xxx-desk test]$ gfortran --version
  5. GNU Fortran 95 (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)
  6. Copyright (C) 2006 Free Software Foundation, Inc.

  7. GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
  8. You may redistribute copies of GNU Fortran
  9. under the terms of the GNU General Public License.
  10. For more information about these matters, see the file named COPYING

  11. [xxx@xxx-desk test]$ uname -a
  12. Linux xxx-desk 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:14 EST 2007 x86_64 x86_64 x86_64 GNU/Linux
复制代码
回复 支持 反对

使用道具 举报

51#
发表于 2007-12-19 18:10 | 只看该作者
gfortran 2.f90 -Wall -g -fverbose-asm -fbounds-check -O3 -ftree-vectorize -funroll-all-loops -mfpmath=sse -march=pentium4 -mfpmath=sse -ffixed-line-length-none -ffree-line-length-none -fimplicit-none -frange-check -Wimplicit-interface -Wunused-parameter -Wconversion -Wunderflow -ftree-vectorizer-verbose=5 -ffpe-trap=invalid,zero,overflow,underflow

这就是一行,不要断行。请看看时间吧。
回复 支持 反对

使用道具 举报

52#
发表于 2007-12-19 18:16 | 只看该作者
好像也差不了多少。
回复 支持 反对

使用道具 举报

53#
发表于 2007-12-19 18:22 | 只看该作者
原帖由 紫色 于 2007-12-19 18:10 发表
gfortran 2.f90 -Wall -g -fverbose-asm -fbounds-check -O3 -ftree-vectorize -funroll-all-loops -mfpmath=sse -march=pentium4 -mfpmath=sse -ffixed-line-length-none -ffree-line-length-none -fimplicit-none  ...
  1. [xxx@xxx-desk test]$ gfortran 2.f90 -Wall -g -fverbose-asm -fbounds-check -O3 -ftree-vectorize -funroll-all-loops -mfpmath=sse -march=pentium4 -mfpmath=sse -ffixed-line-length-none -ffree-line-length-none -fimplicit-none -frange-check -Wimplicit-interface -Wunused-parameter -Wconversion -Wunderflow -ftree-vectorizer-verbose=5 -ffpe-trap=invalid,zero,overflow,underflow
  2. 2.f90:0: error: CPU you selected does not support x86-64 instruction set
  3. 2.f90:0: error: CPU you selected does not support x86-64 instruction set

  4. 只好加个-m32了

  5. [xxx@xxx-desk test]$ gfortran 2.f90 -m32 -Wall -g -fverbose-asm -fbounds-check -O3 -ftree-vectorize -funroll-all-loops -mfpmath=sse -march=pentium4 -mfpmath=sse -ffixed-line-length-none -ffree-line-length-none -fimplicit-none -frange-check -Wimplicit-interface -Wunused-parameter -Wconversion -Wunderflow -ftree-vectorizer-verbose=5 -ffpe-trap=invalid,zero,overflow,underflow

  6. 2.f90:6: note: not vectorized: unsupported use in stmt.
  7. 2.f90:6: note: vectorized 0 loops in function.
  8. [xxx@xxx-desk test]$ time ./a.out
  9.    1.95589140854113

  10. real    0m0.450s
  11. user    0m0.450s
  12. sys     0m0.001s

  13. 原来gfortran生成的64位代码还要更慢。。。。。。嘿嘿,说他弱智不算冤枉吧。

  14. [xxx@xxx-desk test]$ gfortran 2.f90 -Wall -g -fverbose-asm -fbounds-check -O3 -ftree-vectorize -funroll-all-loops -mfpmath=sse -march=nocona -mfpmath=sse -ffixed-line-length-none -ffree-line-length-none -fimplicit-none -frange-check -Wimplicit-interface -Wunused-parameter -Wconversion -Wunderflow -ftree-vectorizer-verbose=5 -ffpe-trap=invalid,zero,overflow,underflow

  15. 2.f90:6: note: not vectorized: unsupported use in stmt.
  16. 2.f90:6: note: vectorized 0 loops in function.
  17. [xxx@xxx-desk test]$ time ./a.out
  18.    1.95589140854128

  19. real    0m0.691s
  20. user    0m0.689s
  21. sys     0m0.001s
复制代码
回复 支持 反对

使用道具 举报

54#
发表于 2007-12-19 18:26 | 只看该作者
原帖由 紫色 于 2007-12-19 18:16 发表
好像也差不了多少。

也不是很多,0.45/0.19 = 2.36
确实不多。。。:sweatingbullets:
回复 支持 反对

使用道具 举报

55#
发表于 2007-12-19 18:40 | 只看该作者
2.36:1?我跑第二个程序连1:1都没有。不过今天我已经很高兴了,因为看到1.f90确实是ifort快,那也是有sin的程序。

非常感谢P大!

[ 本帖最后由 紫色 于 2007-12-24 20:58 编辑 ]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2025-8-9 20:55

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

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