POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
楼主: 紫色
打印 上一主题 下一主题

那位编程举个例子, 把sse的"威力"释放一下?

[复制链接]
61#
发表于 2007-9-30 12:16 | 只看该作者
原帖由 紫色 于 2007-9-30 12:05 发表


我没有看到那个程序的源码,不敢说更多。
质数判定可能是整数编程吧?判定质数需要解析数论的知识从而引入浮点计算么?who knows?
我说了,最好有源码,大家动手编一遍跑一遍,否则你只能去猜。

你当Spec的人是请注意文明用词啊,整数测试放在SpecFP里。
如果你要反驳,请拿出合理的解释,两倍以上的性能提升已经摆在这了,你认为是怎么来的?
回复 支持 反对

使用道具 举报

头像被屏蔽
62#
发表于 2007-9-30 12:21 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

63#
发表于 2007-9-30 12:39 | 只看该作者
AMD可以瞑目了,每次Intel推出SSE指令集的时候,AMD都pdpd的第一时间跟上。

如此看来,AMD真是浪费了无数的晶体管来做这种根本对性能提升无意义的事情啊
回复 支持 反对

使用道具 举报

64#
发表于 2007-9-30 14:32 | 只看该作者
晕死,随便来个简单的吧
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. float a[512][512], b[512][512], c;

  4. int main () {

  5.     srand(0);
  6.     for (int i=0; i < 512; i++){
  7.         for (int j = 0; j < 512; j++){
  8.             a[i][j] = (double)rand() / RAND_MAX;
  9.             b[i][j] = (double)rand() / RAND_MAX;
  10.         }
  11.     }

  12.     for (int N = 1; N < 10000; N++)
  13.     for (int i=0; i < 512; i++){
  14.         for (int j = 0; j < 512; j++){
  15.             c = a[i][j] + a[i][j] * b[i][j];
  16.         }
  17.     }
  18.     printf ("result of c is %fn", c);
  19.     return 0;
  20. }


  21. [test]$ g++ -O3 -mfpmath=387 main.cc -o a.gcc.387
  22. [test]$ g++ -O3 -mfpmath=sse -ftree-vectorize -ftree-vectorizer-verbose=5 main.cc -o a.gcc.sse
  23. main.cc:10: note: not vectorized: unhandled data-ref
  24. main.cc:18: note: not vectorized: live stmt not supported: D.3579_28 = a[i_78][j_79]
  25. main.cc:18: note: vectorized 0 loops in function.
  26. (笨笨的gcc,这么简单的循环居然都不会向量化)

  27. [test]$ icc -fast main.cc -o a.icc
  28. ipo: remark #11001: performing single-file optimizations
  29. ipo: remark #11005: generating object file /tmp/ipo_iccRoENV3.o
  30. main.cc(17): (col. 5) remark: LOOP WAS VECTORIZED.
  31. (还是icc聪明)

  32. [test]$ time ./a.gcc.387
  33. result of c is 1.596053

  34. real    0m3.545s
  35. user    0m3.540s
  36. sys     0m0.004s

  37. [test]$ time ./a.gcc.sse
  38. result of c is 1.596053

  39. real    0m3.454s
  40. user    0m3.451s
  41. sys     0m0.003s

  42. [test]$ time ./a.icc
  43. result of c is 1.596053

  44. real    0m0.766s
  45. user    0m0.765s
  46. sys     0m0.001s
复制代码


[ 本帖最后由 Prescott 于 2007-9-30 14:57 编辑 ]
回复 支持 反对

使用道具 举报

65#
发表于 2007-9-30 15:01 | 只看该作者
原帖由 Prescott 于 2007-9-30 14:32 发表
晕死,随便来个简单的吧
#include
#include

float a[512][512], b[512][512], c;

int main () {

    srand(0);
    for (int i=0; i < 512; i++){
        for (int j = 0; j < 512; j++){
    ...


老P又不厚道了一回
回复 支持 反对

使用道具 举报

66#
发表于 2007-9-30 15:09 | 只看该作者
原帖由 _MyST_Spring 于 2007-9-30 15:01 发表


老P又不厚道了一回

:unsure:

又怎么不厚道了?
回复 支持 反对

使用道具 举报

头像被屏蔽
67#
发表于 2007-9-30 15:12 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

68#
发表于 2007-9-30 15:19 | 只看该作者
原帖由 Prescott 于 2007-9-30 15:09 发表

:unsure:

又怎么不厚道了?


也不给人楼主留点face啊。。
回复 支持 反对

使用道具 举报

69#
 楼主| 发表于 2007-9-30 15:30 | 只看该作者
原帖由 Prescott 于 2007-9-30 14:32 发表
晕死,随便来个简单的吧
#include
#include

float a[512][512], b[512][512], c;

int main () {

    srand(0);
    for (int i=0; i < 512; i++){
        for (int j = 0; j < 512; j++){
    ...



8错的例子。不过只不过是比较了gcc和icc。
你的程序看似循环了512*512次,但每次循环都是独立的对c赋值。其实c最终就等于a(512,512)+a(512,512)*b(512,512)?聪明点的编译器把它优化到运行时间0.0001秒都有可能。
对icc,有其他优化选项完全相同,仅有浮点单元是sse/x87的一点区别的数据提供吗?

PS:能否说一下cpu是啥。类似的程序我跑过不少,p4上加了sse优化,(以下缩水)。

c = a[j] + a[j] * b[j]这种表达式利用不了sse。也许icc能利用sse每次计算两个循环,如果不能保证这一点就改善一下你的代码,让它好利用sse。

[ 本帖最后由 紫色 于 2007-9-30 16:27 编辑 ]
回复 支持 反对

使用道具 举报

70#
发表于 2007-9-30 16:19 | 只看该作者
原帖由 紫色 于 2007-9-30 15:30 发表


8错的例子。不过只不过是比较了gcc和icc。
对icc,有其他优化选项完全相同,仅有浮点单元是sse/x87的一点区别的数据提供吗?


PS:能否说一下cpu是啥。类似的程序我跑过不少,p4上加了sse优化,速度还 ...


  1. [~]$ uname -a
  2. Linux xxxxxxxx 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:14 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

  3. [~]$ cat /proc/cpuinfo
  4. ...
  5. model name      : Intel(R) Core(TM)2 CPU          6700  @ 2.66GHz
  6. ...
复制代码


不好意思,gcc很笨只能生成标量的SSE,icc不支持在64bit环境下生成x87代码。
回复 支持 反对

使用道具 举报

71#
发表于 2007-9-30 17:21 | 只看该作者
原帖由 紫色 于 2007-9-30 15:30 发表



8错的例子。不过只不过是比较了gcc和icc。
你的程序看似循环了512*512次,但每次循环都是独立的对c赋值。其实c最终就等于a(512,512)+a(512,512)*b(512,512)?聪明点的编译器把它优化到运行时间0.0001 ...


稍微修改一下程序,满足你一下:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. float a[512][512], b[512][512], c[512][512], d = 0;

  4. int main () {

  5.     int i,j,N;

  6.     srand(0);
  7.     for (i = 0; i < 512; i++){
  8.         for (j = 0; j < 512; j++){
  9.             a[i][j] = ((float)rand() / RAND_MAX) - 0.5;
  10.             b[i][j] = ((float)rand() / RAND_MAX) - 0.5;
  11.             c[i][j] = 0;
  12.         }
  13.     }

  14.     for (N = 1; N < 100000; N++)
  15.     for (i = 0; i < 512; i++){
  16.         for (j = 0; j < 512; j++ ){
  17.             c[i][j] = c[i][j] + a[i][j] * b[i][j];
  18.         }
  19.     }

  20.     i = rand() % 512;
  21.     j = rand() % 512;
  22.     printf ("result of c[%d][%d] is %fn", i, j, c[i][j]);
  23.     return 0;
  24. }


  25. [test]$ g++ -O3 -mfpmath=387 main.cc -o a.gcc.387

  26. [test]$ g++ -O3 -mfpmath=sse -ftree-vectorize -ftree-vectorizer-verbose=5 main.cc -o a.gcc.sse
  27. main.cc:12: note: not vectorized: unhandled data-ref
  28. main.cc:21: note: dependence distance  = 0.
  29. main.cc:21: note: accesses have the same alignment.
  30. main.cc:21: note: dependence distance modulo vf == 0 between c[i_89][j_91] and c[i_89][j_91]
  31. main.cc:21: note: dependence distance  = 0.
  32. main.cc:21: note: accesses have the same alignment.
  33. main.cc:21: note: dependence distance modulo vf == 0 between c[i_89][j_91] and c[i_89][j_91]
  34. main.cc:21: note: LOOP VECTORIZED.
  35. main.cc:21: note: vectorized 1 loops in function.

  36. [test]$ icc -fast main.cc -o a.icc.sse
  37. ipo: remark #11001: performing single-file optimizations
  38. ipo: remark #11005: generating object file /tmp/ipo_iccjm6Zar.o
  39. main.cc(20): (col. 5) remark: LOOP WAS VECTORIZED.

  40. [test]$ time ./a.gcc.387
  41. result of c[25][391] is -297.068634
  42. real    0m35.912s
  43. user    0m35.903s
  44. sys     0m0.004s

  45. [test]$ time ./a.gcc.sse
  46. result of c[25][391] is -297.068634
  47. real    0m17.791s
  48. user    0m17.783s
  49. sys     0m0.005s

  50. [test]$ time ./a.icc.sse
  51. result of c[25][391] is -297.068634
  52. real    0m17.041s
  53. user    0m17.035s
  54. sys     0m0.003s
复制代码
回复 支持 反对

使用道具 举报

72#
发表于 2007-9-30 19:23 | 只看该作者
:loveliness:
扯那么多干嘛,AMD的U主板bios有个功能可以关掉SSE支持。intel就不知道如何屏蔽了。
如果你是用的X2之类的,大可以关掉SSE回到远古时代,看看会不会是世界末日。
结果是不会,还好Windows不是OSX,没SSE照样工作。倒是KMPlayer直接罢工了,不怕,用WMP11,放个720P的WMV不过也就CPU占用高了10%多而已。
TS的倒是高了%好几十,不过可能是用WMP没SSE视频加速给弄没了吧,倒不是SSE的作用。
在没有SSE的日子里。你才能体会到SSE的好处。
所以我决定再体验三天没有SSE的日子,大家说我能坚持3天不:loveliness: 。有句话不是说失去了才懂得珍惜么。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

73#
发表于 2007-9-30 19:45 | 只看该作者
原帖由 slice 于 2007-9-30 19:23 发表
:loveliness:
扯那么多干嘛,AMD的U主板bios有个功能可以关掉SSE支持。intel就不知道如何屏蔽了。
如果你是用的X2之类的,大可以关掉SSE回到远古时代,看看会不会是世界末日。
结果是不会,还好Windows不是 ...

跑个3dmarks看看。
回复 支持 反对

使用道具 举报

74#
发表于 2007-9-30 19:47 | 只看该作者
原帖由 slice 于 2007-9-30 19:23 发表
:loveliness:
扯那么多干嘛,AMD的U主板bios有个功能可以关掉SSE支持。intel就不知道如何屏蔽了。
如果你是用的X2之类的,大可以关掉SSE回到远古时代,看看会不会是世界末日。
结果是不会,还好Windows不是 ...


只关掉一个核心上的SSE,还是关掉了两个?
回复 支持 反对

使用道具 举报

75#
发表于 2007-9-30 19:57 | 只看该作者
:lol: 什么显卡,跑个OPENGL游戏看看
回复 支持 反对

使用道具 举报

76#
发表于 2007-9-30 20:33 | 只看该作者
原帖由 acqwer 于 2007-9-30 19:45 发表

跑个3dmarks看看。


试了下Mark03。
My God!跑还是能跑,结果有点匪夷所思!放720P的WMVCPU也就30%多变成40%多而已。没想到Mark03会这样子。谁能tell me why?
关SSE简直就是超级幻灯片啊,92分。不关是720分。w00t) 问题出在哪里,Mark03发现没SSE脑袋秀逗了?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

77#
发表于 2007-9-30 20:44 | 只看该作者
以前用sse一直是处理视频图象 没搞过数值计算 随便试了下单精度的计算

var                 s,sbasic:single;
        param1,param2,param3:single;
                   tb,te,tf:int64;
begin
   sbasic:=1.0;
   param1:=19.12;
   param2:=19.13;
   param3:=0.1;

   queryperformancefrequency(tf);
   queryperformanceCounter(tb);

   //包括加/乘/除各一次 循环1000万次并对前次结果依赖 不会产生优化

   //x87指令
   Asm
    mov ecx, 10000000
    fld s
  @loop:
    fmul param1
    fdiv param2
    fadd param3
    dec ecx
    jnz @loop
    fstp s
   end;
   queryperformanceCounter(te);

   //输出时间消耗
   memo1.Lines.Append(format('x87 %f ms %f  ', [(te-tb)/tf*1000,s]) );

   queryperformanceCounter(tb);

   //SSE指令
   Asm
     mov ecx, 10000000
     movss xmm0, sbasic
   @loop:
     movss xmm1, param1
     movss xmm2, param2
     movss xmm3, param3
     mulss xmm0, xmm1
     divss xmm0, xmm2
     addss xmm0, xmm3
     dec  ecx
     jnz  @loop
     movss s, xmm0
   end;
   queryperformanceCounter(te);

      //输出时间消耗
   memo1.Lines.Append(format('SSE %f ms %f  ', [(te-tb)/tf*1000,s]) );

测试结果
x87 170.98 ms 191.33  
SSE 93.73 ms 191.32  

证明即使是不使用SIMD优化,只是替代x87浮点指令为sse指令就能获得接近一倍的速度提高.

但是可以发现, 2者的计算结果有一定的差异. 而双精度的计算结果是191.30,计算结果上反而是SSE更加精确. 所以在浮点计算时采用sse那是很有效果的,如果考虑到SIMD的并行计算,那提高不是一点半点啊.

注: 手头的 delphi 7只支持 sse,不支持sse2 ,没法试双精度了.我想应该区别不大.因为 sse里不管是使用
ps后缀并行计算4个还是采用ss后缀单独计算一个速度是没区别的.

[ 本帖最后由 viewlg 于 2007-9-30 20:46 编辑 ]
回复 支持 反对

使用道具 举报

78#
发表于 2007-9-30 20:45 | 只看该作者
SIMD无用论,竟然这么长时间了还有人在YY(_(

好吧,LZ永远是对的,IBM,Intel,AMD都是250,就LZ有远见,发现了客观事实的真理,佩服,在下一定铭记在心:huh:
回复 支持 反对

使用道具 举报

79#
发表于 2007-9-30 20:54 | 只看该作者
原帖由 slice 于 2007-9-30 20:33 发表


试了下Mark03。
My God!跑还是能跑,结果有点匪夷所思!放720P的WMVCPU也就30%多变成40%多而已。没想到Mark03会这样子。谁能tell me why?
关SSE简直就是超级幻灯片啊,92分。不关是720分。w00t) 问题出 ...



SSE的Sqrt计算比FP的Sqrt计算快10倍以上(单运算而不考虑simd,考虑simd则是接近50倍).而开方计算是3d驱动里最常见的计算.
回复 支持 反对

使用道具 举报

80#
发表于 2007-9-30 21:00 | 只看该作者
原帖由 slice 于 2007-9-30 20:33 发表


试了下Mark03。
My God!跑还是能跑,结果有点匪夷所思!放720P的WMVCPU也就30%多变成40%多而已。没想到Mark03会这样子。谁能tell me why?
关SSE简直就是超级幻灯片啊,92分。不关是720分。w00t) 问题出 ...

03也就罢了,05、06没SSE根本不让你跑。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-6 10:35

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

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