找回密码
 欢迎注册
楼主: liangbch

[分享] B计划之基本函数性能预览

[复制链接]
发表于 2008-5-7 14:46:08 | 显示全部楼层


你还没考虑SSE2的8路展开版本了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-7 14:48:58 | 显示全部楼层
另外,你没比较超过L2缓存大小的数据
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-7 15:58:45 | 显示全部楼层
SSE2 的版本使用循环展开提速不明显,我的版本在每个循环步使用2条movdqa指令,也就是说和A_Clear_R8一样,每个循环步处理 8个DWORD,你的那个版本每个循环步使用1条movdqa指令,但速度没有明显变化,SSE2指令的版本,movdqa 是瓶颈,循环控制所花的时间可以忽略不计。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-7 15:59:13 | 显示全部楼层
很大的内存块(超过L2cache)清零的优化,我暂时不考虑。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-7 16:13:40 | 显示全部楼层


movq呢?
movdqa可能因为CPU数据总线是64位的,会有冲突

多几次movq看下效果如何?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-7 20:15:06 | 显示全部楼层
我对4#有疑问,具体自己检查

另外,你时间不要写这么多零好不好?
我眼睛不好,也数不过来



最后希望能看到你测试的源代码
还有,是否用了Intel编译器?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-8 10:07:36 | 显示全部楼层
1.好吧,容我将单位改为毫秒。
2.编译器使用VC6.0,如果使用intel编译器,他会将简单循环作4路展开,C语言版的函数和汇编语言的4路循环展开版本大致相当。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-8 17:53:33 | 显示全部楼层
说几个对你测试的问题
1、清零的速度还可以提升
我算过,每秒可达到2.5GB/s以上,我的机器不如你的, 但我测试清零速度似乎能达到2.0G以上,你的似乎达不到
2、加的时钟你P4上的三操作数C代码是6.0个时钟每双字,而我算我的是4.9,说明加法要改进一个时钟是很困难的,你的代码虽然是2^30进制,但应该和我的2^32进制不会存在明显的差异,因为你多的操作应该不会造成很明显的延时
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-8 22:46:29 | 显示全部楼层
这里给出测试代码,请检查我的测试方法是否科学。
  1. int main(int argc, char* argv[])
  2. {
  3.         test_a_clear();
  4.         test_a_copy();
  5.         test_add();
  6.         test_sub();
  7.         test_neg();
  8.         return 0;
  9. }

  10. void test_a_clear()
  11. {
  12.         int n=8192;
  13.         //createFolders();

  14.         //test_clear_function(256);
  15.        
  16.         test_clear_speed( n,0);
  17.         test_clear_speed( n,1);
  18.         test_clear_speed( n,2);
  19.         test_clear_speed( n,3);
  20.         test_clear_speed( n,4);
  21.         test_clear_speed( n,5);
  22.         test_clear_speed( n,6);
  23.         test_clear_speed( n,7);
  24. }

  25. void test_a_copy()
  26. {
  27.         int n=8192;
  28.         //createFolders();
  29.         //test_copy_function(256);

  30.         test_copy_speed(n,0,0);
  31.         test_copy_speed(n,0,1);
  32.         test_copy_speed(n,0,2);
  33.         test_copy_speed(n,0,3);

  34.         test_copy_speed(n,1,0);
  35.         test_copy_speed(n,1,1);
  36.         test_copy_speed(n,1,2);
  37.         test_copy_speed(n,1,3);

  38.         test_copy_speed(n,2,0);
  39.         test_copy_speed(n,2,1);
  40.         test_copy_speed(n,2,2);
  41.         test_copy_speed(n,2,3);

  42.         test_copy_speed(n,3,0);
  43.         test_copy_speed(n,3,1);
  44.         test_copy_speed(n,3,2);
  45.         test_copy_speed(n,3,3);
  46. }

  47. void test_add()
  48. {
  49.         test_add_function(1024);
  50.         test_add_speed( 8192);
  51. }

  52. void test_sub()
  53. {
  54.         test_sub_function(1024);
  55.         test_sub_speed( 8192);
  56. }

  57. void test_neg()
  58. {
  59.         test_neg_function(1024);
  60.         test_neg_speed( 8192);
  61. }

  62. void test_clear_speed( int len,int align16_offset)
  63. {
  64.         DWORD *pData=  (DWORD *)malloc( (len+64)* sizeof(DWORD));
  65.        
  66.         DWORD *pTest1= (DWORD *)malloc( (len+64)* sizeof(DWORD));
  67.         DWORD *pTest2= (DWORD *)malloc( (len+64)* sizeof(DWORD));
  68.         DWORD *pTest3= (DWORD *)malloc( (len+64)* sizeof(DWORD));
  69.         DWORD *pTest4= (DWORD *)malloc( (len+64)* sizeof(DWORD));
  70.         DWORD *pTest5= (DWORD *)malloc( (len+64)* sizeof(DWORD));
  71.        
  72.        
  73.         DWORD *pBuff1=NULL;
  74.         DWORD *pBuff2=NULL;
  75.         DWORD *pBuff3=NULL;
  76.         DWORD *pBuff4=NULL;
  77.         DWORD *pBuff5=NULL;
  78.        
  79.         int count=0;
  80.         double t1,t2,t3,t4,t5;
  81.         double s_t1,s_t2,s_t3,s_t4,s_t5;
  82.         MadeNum(pData,len+32);

  83.         count=0;
  84.         s_t1=0.00;
  85.         s_t2=0.00;
  86.         s_t3=0.00;
  87.         s_t4=0.00;
  88.         s_t5=0.00;
  89.         DWORD tmp;
  90.        
  91.         tmp=(DWORD)pTest1;
  92.         while ((tmp & 0x3f) !=0)
  93.                 tmp+=4;
  94.         pBuff1=(DWORD *)tmp;
  95.         //--------------
  96.         tmp=(DWORD)pTest2;
  97.         while ((tmp & 0x3f) !=0)
  98.                 tmp+=4;
  99.         pBuff2=(DWORD *)tmp;
  100.         //--------------
  101.         tmp=(DWORD)pTest3;
  102.         while ((tmp & 0x3f) !=0)
  103.                 tmp+=4;
  104.         pBuff3=(DWORD *)tmp;
  105.         //--------------
  106.         tmp=(DWORD)pTest4;
  107.         while ((tmp & 0x3f) !=0)
  108.                 tmp+=4;
  109.         pBuff4=(DWORD *)tmp;

  110.        
  111.         tmp=(DWORD)pTest5;
  112.         while ((tmp & 0x3f) !=0)
  113.                 tmp+=4;
  114.         pBuff5=(DWORD *)tmp;


  115.         pBuff1 += align16_offset;
  116.         pBuff2 += align16_offset;
  117.         pBuff3 += align16_offset;
  118.         pBuff4 += align16_offset;
  119.         pBuff5 += align16_offset;

  120.         do
  121.         {
  122.                 memcpy(pBuff1,pData,(len)*sizeof(DWORD));
  123.                 memcpy(pBuff2,pData,(len)*sizeof(DWORD));
  124.                 memcpy(pBuff3,pData,(len)*sizeof(DWORD));
  125.                 memcpy(pBuff4,pData,(len)*sizeof(DWORD));
  126.                 memcpy(pBuff5,pData,(len)*sizeof(DWORD));

  127.                 t1=currTime();
  128.                 memset(pBuff1,0,len*sizeof(DWORD));
  129.                 t1=currTime()-t1;
  130.                 s_t1+=t1;

  131.                 t2=currTime();
  132.                 A_Clear(pBuff2,len);
  133.                 t2=currTime()-t2;
  134.                 s_t2+=t2;
  135.                
  136.                 t3=currTime();
  137.                 A_Clear_R8(pBuff3,len);
  138.                 t3=currTime()-t3;
  139.                 s_t3+=t3;
  140.                
  141.                 t4=currTime();
  142.                 A_Clear_With_SSE2(pBuff4,len);
  143.                 t4=currTime()-t4;
  144.                 s_t4+=t4;


  145.                 t5=currTime();
  146.                 yaos_AsmMemZero0(pBuff5,len);
  147.                 t5=currTime()-t5;
  148.                 s_t5+=t5;

  149.                 count++;

  150.         }while (s_t1<0.001);
  151.         s_t1 /=count;
  152.         s_t2 /=count;
  153.         s_t3 /=count;
  154.         s_t4 /=count;
  155.         s_t5 /=count;

  156.         printf("\n\nClear zero function speed test,length unit: DWORD, time unit: ms\n");
  157.         printf("pBuff1=%x\t",(DWORD)pBuff1);
  158.         printf("pBuff2=%x\t",(DWORD)pBuff2);
  159.         printf("pBuff3=%x\t",(DWORD)pBuff3);
  160.         printf("pBuff4=%x\t",(DWORD)pBuff4);
  161.         printf("pBuff5=%x\t",(DWORD)pBuff5);


  162.         printf("\nlength\taddress\tmemset\tA_Clean\tA_Clean_R8\tA_Clear_With_SSE2\tyaos_AsmMemZero0\n");
  163.         printf("%d\t32X+%d\t%.6f\t%.6f\t%.6f\t%.6f\t%.6f\n",
  164.                 len,align16_offset*4,
  165.                 s_t1*1000,s_t2*1000,s_t3*1000,s_t4*1000,s_t5*1000);
  166.        
  167.         free(pData);
  168.         free(pTest1);
  169.         free(pTest2);
  170.         free(pTest3);
  171.         free(pTest4);
  172.         free(pTest5);
  173. }

  174. void test_copy_speed( int len,int src_offset,int tag_offset)
  175. {
  176.         DWORD *pData=  (DWORD *)malloc( (len+32)* sizeof(DWORD));
  177.         DWORD *pTest1= (DWORD *)malloc( (len+32)* sizeof(DWORD));
  178.         DWORD *pTest2= (DWORD *)malloc( (len+32)* sizeof(DWORD));
  179.         DWORD *pTest3= (DWORD *)malloc( (len+32)* sizeof(DWORD));
  180.         DWORD *pTest4= (DWORD *)malloc( (len+32)* sizeof(DWORD));
  181.        
  182.         int i,j,count=0;
  183.         double t,s_t1,s_t2,s_t3,s_t4;       
  184.         double min_t1,min_t2,min_t3,min_t4;
  185.         DWORD *psrc;
  186.         DWORD *ptag1;
  187.         DWORD *ptag2;
  188.         DWORD *ptag3;
  189.         DWORD *ptag4;
  190.         DWORD tmp;


  191.         MadeNum(pData,len+32);

  192.         count=1024;
  193.         min_t1=min_t2=min_t3=min_t4=1000;

  194.         tmp=(DWORD)pData;
  195.         while ((tmp & 0x1f) !=0)
  196.                 tmp+=4;
  197.         psrc=(DWORD *)tmp;
  198.         //--------------
  199.         tmp=(DWORD)pTest1;
  200.         while ((tmp & 0x1f) !=0)
  201.                 tmp+=4;
  202.         ptag1=(DWORD *)tmp;
  203.         //--------------
  204.         tmp=(DWORD)pTest2;
  205.         while ((tmp & 0x1f) !=0)
  206.                 tmp+=4;
  207.         ptag2=(DWORD *)tmp;
  208.         //--------------
  209.         tmp=(DWORD)pTest3;
  210.         while ((tmp & 0x1f) !=0)
  211.                 tmp+=4;
  212.         ptag3=(DWORD *)tmp;

  213.         //--------------
  214.         tmp=(DWORD)pTest4;
  215.         while ((tmp & 0x1f) !=0)
  216.                 tmp+=4;
  217.         ptag4=(DWORD *)tmp;
  218.        

  219.         for (i=0;i<8;i++)
  220.         {       
  221.                 t=currTime();
  222.                 for (j=0;j<count;j++)
  223.                 {
  224.                         memcpy(ptag1+tag_offset,psrc+src_offset,len*sizeof(DWORD));
  225.                 }
  226.                 s_t1=currTime()-t;
  227.                 s_t1 /=count;
  228.                 if (s_t1<min_t1)
  229.                         min_t1=s_t1;
  230.         }

  231.         for (i=0;i<8;i++)
  232.         {
  233.                 t=currTime();
  234.                 for (j=0;j<count;j++)
  235.                 {
  236.                         A_Copy(ptag2+tag_offset,psrc+src_offset,len);
  237.                 }
  238.                 s_t2=currTime()-t;

  239.                 s_t2 /=count;
  240.                 if (s_t2<min_t2)
  241.                         min_t2=s_t2;
  242.         }

  243.         for (i=0;i<8;i++)
  244.         {
  245.                 t=currTime();
  246.                 for (j=0;j<count;j++)
  247.                 {
  248.                         A_Copy_With_SSE2(ptag3+tag_offset,psrc+src_offset,len);
  249.                 }
  250.                 s_t3=currTime()-t;
  251.                 s_t3 /=count;

  252.                 if (s_t3<min_t3)
  253.                         min_t3=s_t3;
  254.         }               
  255.        
  256.         for (i=0;i<8;i++)
  257.         {       
  258.                 t=currTime();
  259.                 for (j=0;j<count;j++)
  260.                 {
  261.                         A_Copy_R8(ptag4+tag_offset,psrc+src_offset,len);
  262.                 }
  263.                 s_t4=currTime()-t;
  264.                 s_t4 /=count;
  265.                 if (s_t4<min_t4)
  266.                         min_t4=s_t4;
  267.         }
  268.        
  269.         printf("\n\n4 copy function speed test,time unit: ms,length unint:DWORD\n");
  270.         printf("length\tsource address\ttarget address\tmemcpy\tA_Copy\tA_Copy_With_SSE2\tA_Copy_R8\n");
  271.         printf("%d\t16X+%d\t16X+%d\t%.6f\t%.6f\t%.6f\t%.6f\n",
  272.                 len,src_offset*4,tag_offset*4,
  273.                 min_t1*1000,min_t2*1000,min_t3*1000,min_t4*1000);
  274.        
  275.         free(pData);
  276.         free(pTest1);
  277.         free(pTest2);
  278.         free(pTest3);
  279.         free(pTest4);
  280. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-8 22:47:21 | 显示全部楼层
接楼上:
  1. void test_add_speed( int len)
  2. {
  3.         DWORD *pData1=  (DWORD *)malloc( (len+4)* sizeof(DWORD));
  4.         DWORD *pData2=  (DWORD *)malloc( (len+4)* sizeof(DWORD));
  5.        
  6.         DWORD *pResult1= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  7.         DWORD *pResult2= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  8.         DWORD *pResult3= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  9.         DWORD *pResult4= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  10.         DWORD *pResult5= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  11.        
  12.         int i,j,count=0;
  13.         double t,s_t1,s_t2,s_t3,s_t4,s_t5;       
  14.         double min_t1,min_t2,min_t3,min_t4,min_t5;

  15.         MadeNum(pData1,len+4);
  16.         MadeNum(pData2,len+4);

  17.         A_Copy(pResult1,pData1,len+4);
  18.         A_Copy(pResult2,pData1,len+4);
  19.         A_Copy(pResult3,pData1,len+4);

  20.         count=1024;
  21.         min_t1=min_t2=min_t3=min_t4=min_t5=1000;

  22.         for (i=0;i<8;i++)
  23.         {
  24.                 t=currTime();
  25.                 for (j=0;j<count;j++)
  26.                 {
  27.                         BIN_Add_C(pResult1,pData2,len);
  28.                 }
  29.                 s_t1=currTime()-t;

  30.                 s_t1 /=count;
  31.                 if (s_t1<min_t1)
  32.                         min_t1=s_t1;
  33.         }

  34.         for (i=0;i<8;i++)
  35.         {
  36.                 t=currTime();
  37.                 for (j=0;j<count;j++)
  38.                 {
  39.                         BIN_Add(pResult2,pData2,len);
  40.                 }
  41.                 s_t2=currTime()-t;
  42.                 s_t2 /=count;

  43.                 if (s_t2<min_t2)
  44.                         min_t2=s_t2;
  45.         }               
  46.        
  47.         for (i=0;i<8;i++)
  48.         {       
  49.                 t=currTime();
  50.                 for (j=0;j<count;j++)
  51.                 {
  52.                         BIN_Add_4way_unroll(pResult3,pData2,len);
  53.                 }
  54.                 s_t3=currTime()-t;
  55.                 s_t3 /=count;
  56.                 if (s_t3<min_t3)
  57.                         min_t3=s_t3;
  58.         }

  59.         for (i=0;i<8;i++)
  60.         {       
  61.                 t=currTime();
  62.                 for (j=0;j<count;j++)
  63.                 {
  64.                         BIN_Add_3P_C(pResult4,pData1,pData2,len);
  65.                 }
  66.                 s_t4=currTime()-t;
  67.                 s_t4 /=count;
  68.                 if (s_t4<min_t4)
  69.                         min_t4=s_t4;
  70.         }

  71.         for (i=0;i<8;i++)
  72.         {       
  73.                 t=currTime();
  74.                 for (j=0;j<count;j++)
  75.                 {
  76.                         BIN_Add_3P_4way_unroll(pResult5,pData1,pData2,len);
  77.                 }
  78.                 s_t5=currTime()-t;
  79.                 s_t5 /=count;
  80.                 if (s_t5<min_t5)
  81.                         min_t5=s_t5;
  82.         }
  83.        
  84.         printf("\n\n5 add function speed test,time unit: ms,length unint:DWORD\n");
  85.         printf("length\tBIN_ADD_C\tBIN_Add\tBIN_Add_4way_unroll\tBIN_Add_3P_C\tBIN_Add_3P_4way_unroll\n");
  86.         printf("%d\t%.6f\t%.6f\t%.6f\t%.6f\t%.6f\n",len,
  87.                 min_t1*1000,min_t2*1000,min_t3*1000,min_t4*1000,min_t5*1000);
  88.        
  89.         free(pData1);
  90.         free(pData2);
  91.         free(pResult1);
  92.         free(pResult2);
  93.         free(pResult3);
  94.         free(pResult4);
  95.         free(pResult5);

  96. }

  97. void test_sub_speed( int len)
  98. {
  99.         DWORD *pData1=  (DWORD *)malloc( (len+4)* sizeof(DWORD));
  100.         DWORD *pData2=  (DWORD *)malloc( (len+4)* sizeof(DWORD));
  101.         DWORD *pResult1= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  102.         DWORD *pResult2= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  103.         DWORD *pResult3= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  104.         DWORD *pResult4= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  105.         DWORD *pResult5= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  106.        
  107.         int i,j,count=0;
  108.         double t,s_t1,s_t2,s_t3,s_t4,s_t5;       
  109.         double min_t1,min_t2,min_t3,min_t4,min_t5;

  110.         createFolders();

  111.         MadeNum(pData1,len+4);
  112.         MadeNum(pData2,len+4);

  113.         A_Copy(pResult1,pData1,len+4);
  114.         A_Copy(pResult2,pData1,len+4);
  115.         A_Copy(pResult3,pData1,len+4);

  116.         count=1024;
  117.         min_t1=min_t2=min_t3=min_t4=min_t5=1000;

  118.         for (i=0;i<8;i++)
  119.         {
  120.                 t=currTime();
  121.                 for (j=0;j<count;j++)
  122.                 {
  123.                         BIN_Sub_C(pResult1,pData2,len);
  124.                 }
  125.                 s_t1=currTime()-t;

  126.                 s_t1 /=count;
  127.                 if (s_t1<min_t1)
  128.                         min_t1=s_t1;

  129.         }

  130.         for (i=0;i<8;i++)
  131.         {
  132.                 t=currTime();
  133.                 for (j=0;j<count;j++)
  134.                 {
  135.                         BIN_Sub_C(pResult2,pData2,len);
  136.                 }
  137.                 s_t2=currTime()-t;
  138.                 s_t2 /=count;

  139.                 if (s_t2<min_t2)
  140.                         min_t2=s_t2;
  141.         }               
  142.        
  143.         for (i=0;i<8;i++)
  144.         {       
  145.                 t=currTime();
  146.                 for (j=0;j<count;j++)
  147.                 {
  148.                         BIN_Sub_4way_unroll(pResult3,pData2,len);
  149.                 }
  150.                 s_t3=currTime()-t;
  151.                 s_t3 /=count;
  152.                 if (s_t3<min_t3)
  153.                         min_t3=s_t3;
  154.         }
  155.        
  156.         for (i=0;i<8;i++)
  157.         {       
  158.                 t=currTime();
  159.                 for (j=0;j<count;j++)
  160.                 {
  161.                         BIN_Sub_3P_C(pResult4,pData1,pData2,len);
  162.                 }
  163.                 s_t4=currTime()-t;
  164.                 s_t4 /=count;
  165.                 if (s_t4<min_t4)
  166.                         min_t4=s_t4;
  167.         }

  168.         for (i=0;i<8;i++)
  169.         {       
  170.                 t=currTime();
  171.                 for (j=0;j<count;j++)
  172.                 {
  173.                         BIN_Sub_3P_4way_unroll(pResult5,pData1,pData2,len);
  174.                 }
  175.                 s_t5=currTime()-t;
  176.                 s_t5 /=count;
  177.                 if (s_t5<min_t5)
  178.                         min_t5=s_t5;
  179.         }

  180.         printf("\n\n5sub function speed test,time unit: ms,length unint:DWORD\n");
  181.         printf("length\tBIN_Sub_C\tBIN_Sub\tBIN_sub_4way_unroll\tBIN_sub_3P_C\tBIN_sub_3P_4way_unroll\n");
  182.         printf("%d\t%.6f\t%.6f\t%.6f\t%.6f\t%.6f\n",
  183.                 len,min_t1*1000,min_t2*1000,min_t3*1000,min_t4*1000,min_t5*1000);
  184.        
  185.         free(pData1);
  186.         free(pData2);
  187.         free(pResult1);
  188.         free(pResult2);
  189.         free(pResult3);
  190.         free(pResult4);
  191.         free(pResult5);
  192. }

  193. void test_neg_speed( int len)
  194. {
  195.         DWORD *pData1=  (DWORD *)malloc( (len+4)* sizeof(DWORD));
  196.        
  197.         DWORD *pResult1= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  198.         DWORD *pResult2= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  199.         DWORD *pResult3= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  200.         DWORD *pResult4= (DWORD *)malloc( (len+4)* sizeof(DWORD));
  201.        
  202.         int i,j,count=0;
  203.         double t,s_t1,s_t2,s_t3,s_t4;       
  204.         double min_t1,min_t2,min_t3,min_t4;

  205.         MadeNum(pData1,len+4);

  206.         A_Copy(pResult1,pData1,len+4);
  207.         A_Copy(pResult2,pData1,len+4);
  208.         A_Copy(pResult3,pData1,len+4);
  209.         A_Copy(pResult4,pData1,len+4);

  210.         count=1024;
  211.         min_t1=min_t2=min_t3=min_t4=1000;

  212.         for (i=0;i<8;i++)
  213.         {
  214.                 t=currTime();
  215.                 for (j=0;j<count;j++)
  216.                 {
  217.                         BIN_Negate(pResult1,len);
  218.                 }
  219.                 s_t1=currTime()-t;

  220.                 s_t1 /=count;
  221.                 if (s_t1<min_t1)
  222.                         min_t1=s_t1;
  223.         }

  224.         for (i=0;i<8;i++)
  225.         {
  226.                 t=currTime();
  227.                 for (j=0;j<count;j++)
  228.                 {
  229.                         BIN_Negate_C(pResult2,len);
  230.                 }
  231.                 s_t2=currTime()-t;
  232.                 s_t2 /=count;

  233.                 if (s_t2<min_t2)
  234.                         min_t2=s_t2;
  235.         }               
  236.        
  237.         for (i=0;i<8;i++)
  238.         {       
  239.                 t=currTime();
  240.                 for (j=0;j<count;j++)
  241.                 {
  242.                         BIN_Negate_4way_unroll(pResult3,len);
  243.                 }
  244.                 s_t3=currTime()-t;
  245.                 s_t3 /=count;
  246.                 if (s_t3<min_t3)
  247.                         min_t3=s_t3;
  248.         }

  249.         for (i=0;i<8;i++)
  250.         {       
  251.                 t=currTime();
  252.                 for (j=0;j<count;j++)
  253.                 {
  254.                         BIN_Negate_SSE2(pResult4,len);
  255.                 }
  256.                 s_t4=currTime()-t;
  257.                 s_t4 /=count;
  258.                 if (s_t4<min_t4)
  259.                         min_t4=s_t4;
  260.         }

  261.         printf("\n\n4 neg function speed test,time unit: ms,length unint:DWORD\n");
  262.         printf("length\tBIN_NEG\t\tBIN_NEG_C\tBIN_NEG_4way_unroll\tBIN_Negate_SSE2\n");
  263.         printf("%d\t%.6f\t%.6f\t%.6f\t%.6f\n",len,
  264.                 min_t1*1000,min_t2*1000,min_t3*1000,min_t4*1000);
  265.        
  266.         free(pData1);
  267.         free(pResult1);
  268.         free(pResult2);
  269.         free(pResult3);
  270.         free(pResult4);
  271. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-27 23:37 , Processed in 0.067093 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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