Advertisement
Guest User

SSE +=

a guest
Feb 28th, 2013
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3.     #include <cstdio>
  4.     #include <cstdlib>
  5.     #include <cstring>
  6.     #include <map>
  7.     #include <unordered_map>
  8.     #include <vector>
  9.     #include <fstream>
  10.     #include <iterator>
  11.     #include <algorithm>
  12.     #include <list>
  13.     #include <sstream>
  14.     #include <iostream>
  15.     #include <bitset>
  16.     #include <array>
  17.     #include <ctype.h>
  18.     #include <ctime>
  19.  
  20.     #include <emmintrin.h>
  21.  
  22.     using namespace std;
  23.  
  24.     inline void addToDoubleVectorSSE(
  25.          const double * what, const double * toWhat, double * dest, const unsigned int len)
  26. {
  27. __m128d * _what         = (__m128d*)what;
  28. __m128d * _toWhat       = (__m128d*)toWhat;
  29. __m128d * _toWhatBase   = (__m128d*)toWhat;
  30.  
  31. __m128d _dest1;
  32. __m128d _dest2;
  33.  
  34.     for ( register unsigned int i = 0; i < len; i+= 4, _what += 2, _toWhat += 2, _toWhatBase+=2 )
  35.     {
  36.         _toWhatBase = _toWhat;
  37.         _dest1      = _mm_add_pd( *_what, *_toWhat );
  38.         _dest2      = _mm_add_pd( *(_what+1), *(_toWhat+1));
  39.  
  40.         *_toWhatBase = _dest1;
  41.         *(_toWhatBase+1) = _dest2;
  42.     }
  43.     /*
  44. for ( register unsigned int i = 0; i < len; i+= 4 )
  45. {
  46.     _toWhatBase = _toWhat;
  47.     _dest1      = _mm_add_pd( *_what++, *_toWhat++ );
  48.     _dest2      = _mm_add_pd( *_what++, *_toWhat++ );
  49.  
  50.     *_toWhatBase++ = _dest1;
  51.     *_toWhatBase++ = _dest2;
  52. }*/
  53. }
  54.  
  55.  
  56.     int main(int argc, const char* argv[]) {
  57.         int count = 10000000;
  58.         __declspec(align(16)) double a[100];
  59.         __declspec(align(16)) double b[100];
  60.         for (int i =0 ; i != 100 ; i++) {
  61.             a[i] = i*i;
  62.             b[i] = sqrt((double)i);
  63.         }
  64.         __declspec(align(16)) double c[100];
  65.         clock_t start = clock();
  66.         for (int i = 0 ; i != count ; i++) {
  67.             addToDoubleVectorSSE(a, b, c, 100);
  68.         }
  69.         cout << clock() - start << endl;
  70.         return 0;
  71.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement