sse指令加速例子-无对比

举报
风吹稻花香 发表于 2021/06/04 23:52:16 2021/06/04
【摘要】 #define WIN   #include "timing.h"   #include <intrin.h>   #include <stdlib.h>   #include <math.h> &n...
  1. #define WIN  
  2. #include "timing.h"  
  3. #include <intrin.h>  
  4. #include <stdlib.h>  
  5. #include <math.h>  
  6.   
  7. #define N 4*100000      // 注意:必须是4的倍数,否则使用SSE指令计算,要进行一些处理,从而保证正确。  
  8. _MM_ALIGN16 float op1[N];  
  9. _MM_ALIGN16 float op2[N];  
  10. _MM_ALIGN16 float result1[N];  
  11. _MM_ALIGN16 float result2[N];  
  12.   
  13. void init()  
  14. {  
  15.     for(int i = 0;i < N; i++)  
  16.     {  
  17.         op1[i] = (float)rand()/(float)RAND_MAX;  
  18.         op2[i] = (float)rand()/(float)RAND_MAX;  
  19.     }  
  20. }  
  21.   
  22. void checkResult(int debug)  
  23. {  
  24.     bool isSame = true;  
  25.     for(int i = 0;i < N; i++)  
  26.     {  
  27.         if (debug)  
  28.         {  
  29.             printf("%lf     %lf\n", result1[i], result2[i]);  
  30.         }  
  31.         else  
  32.         {  
  33.             if (fabs(result1[i] - result2[i]) > 0.000001)  
  34.             {  
  35.                 isSame = false;  
  36.                 break;  
  37.             }  
  38.         }  
  39.     }  
  40.     if (!debug) {  
  41.         if (isSame)  
  42.             printf("Result is Same\n");  
  43.         else  
  44.             printf("Result is not same\n");  
  45.     }  
  46. }  
  47.   
  48. void add1()  
  49. {  
  50.     for(int i = 0; i < N;i++)  
  51.         result1[i] = op1[i] + op2[i];  
  52. }  
  53.   
  54. void add2()  
  55. {  
  56.     __m128  a;  
  57.     __m128  b;  
  58.     __m128  c;  
  59.   
  60.     for(int i = 0; i < N;i = i + 4)  
  61.     {  
  62.         // Load  
  63.         a = _mm_load_ps(op1 + i);  
  64.         b = _mm_load_ps(op2 + i);  
  65.   
  66.         c = _mm_add_ps(a, b);   // c = a + b  
  67.   
  68.         _mm_store_ps(result2 + i, c);  
  69.     }  
  70. }  
  71.   
  72. int main(int argc, char* argv[])  
  73. {  
  74.     init();  
  75.     srand((unsigned int)time(NULL));  
  76.   
  77.     printf("Add a vector:\n");  
  78.     startTiming();  
  79.     add1();  
  80.     stopWithPrintTiming();  
  81.   
  82.     printf("\n");  
  83.     printf("Add a vector with SSE instructions:\n");  
  84.     startTiming();  
  85.     add2();  
  86.     stopWithPrintTiming();  
  87.   
  88.     printf("\n");  
  89.     checkResult(0);  
  90.   
  91.     return 0;  



文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/54669050

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。