Vectorization with SSE


Using OpenCL, CUDA, or OpenACC to take advantage of the computing power offered by GPGPUs is the most effective way to accelerate computationally expensive code nowadays. However, not all machines have powerful GPGPUs.  On the other hand, all modern x86 processors from Intel and AMD support vector instructions in the form of Streaming SIMD Extensions (SSE – SSE4) and most new processors support Advanced Vector Extensions (AVX). Utilizing these instructions makes it easy to improve the performance of your code by as much as a factor of eight (AVX-512 will increase this to a factor of 16, but this is only for Intel MIC cards). In some cases, compilers can automatically vectorize pieces of code to take advantage of the CPU’s vector units. Furthermore, OpenMP 4.0 allows you to automatically vectorize certain sections of code, but writing code with vector operations in mind will generally yield better results. In this post, I will briefly explain how to use SSE to vectorize C and C++ code using GCC 4.8. Most of the instructions should also apply to LLVM/Clang and Microsoft Visual Studio.

SSE registers are 128 bits (16 bytes) wide. This means that each register can store 4 single precision floating point numbers or 2 double precision floating point numbers as well as other types that add up to 16 bytes. Using SSE, we can perform 4 single precision or 2 double precision floating point operations simultaneously on one CPU core using one instruction. Note: A superscalar processor, containing multiple floating point units, can also perform multiple floating point operations simultaneously, however a separate instruction is issued for each operation and the programmer has little, if any, control over which operations are performed simultaneously. Using SSE, we also have more control over the cache and prefetching. It’s even possible to bypass the cache entirely, which can be useful in some cases where cache pollution would cause a performance hit. With SSE, we can even eliminate some branches in the code, thereby reducing the chance of a branch misprediction, which would necessitate a pipeline flush. This can potentially improve performance further.

First-generation SSE instructions can be accessed using the header xmmintrin.h.  SSE2 and 3 instructions can be used by including emmintrin.h and pmmintrin.h, respectively. To access all vector extensions, including SSE4 and AVX, use immintrin.h. You also need to consult your compiler’s documentation to learn which flags / switches are required to enable the instructions. In the code example below, I demonstrate…
  • initialization of a vector at compile time
  • initialization of a vector from an array
  • storing vector data in an array
  • vector addition
  • vector multiplication
  • vector division
  • multiplication by a scalar
  • using element-wise comparison to create a mask
  • bitwise AND, OR and ANDNOT (NAND)
  • how to replace a conditional statement using the mask
  • the vector square root
  • the approximate inverse square root
  • the approximate reciprocal instruction
  • how to use the shuffle instruction and the SHUFFLE macro.
The code sample compiles on g++ 4.8. Some minor changes may be needed for other compilers. Some of these changes are mentioned in the comments. Click here for a version of the example that compiles in g++ 4.7 and clang++ 3.0 (and probably other compilers).

 
/* 
 vector.cpp
 compile with g++ vector.cpp -o vector -O2 -msse 
*/

#include <iostream>
#include "xmmintrin.h"

#define PRINT(var) print((var), #var)

using namespace std;

// v4si: vector of four single-precision floats
typedef float v4sf __attribute__ ((vector_size (16)));

// these are used for printing the results
void print(const v4sf& vec, const char* name);
void print(const float* vec, const char* name);

int main()
{
   // one way to initialize a vector
   v4sf vecA = {0, 1, 2, 3};

   // another way: loading the data from a 16-byte aligned array
   float arrayA[] = {4, 2, 3, 6};
  
   v4sf vecAA = _mm_load_ps(arrayA);

   /* also refer to _mm_setzero_ps(), _mm_set1_ps(), _mm_load_ss(), 
      _mm_load1_ps(), _mm_loadu_ps(), _mm_loadr_ps(), _mm_set_ps(), 
      and _mm_setr_ps() in xmmintrin.h for vector initialization. */

   // one way of adding vectors. The other method explicitly uses 
   // _mm_add_ps()
   v4sf vecB = vecA + vecA;

   float arrayB[4];

   // store vector data in an array
   _mm_store_ps (arrayB, vecB);

   /* NOTE: g++ 4.8 automatically converts scalars to vectors. Other
      compilers (such as g++ 4.7) require you to set up the vectors
      explicitly. An easy way to do this is to use _mm_set1_ps().
    */

   // multiplication by a scalar
   v4sf vecC = 2.0 * vecB; // _mm_set1_ps(2.0) * vecB;

   // more complicated expressions 
   v4sf vecD = vecC - 0.5 * vecA;

   v4sf vecE = 1.0 + 5.0 * vecC / (vecA + 3.0);

   /* for logic operations, TRUE = 0xFFFFFFFF, FALSE = 0x00000000
      Thus, the result is a mask which can be bitwise ANDed using 
      _mm_and_ps() */

   v4sf mask = (vecA == vecB);  // _mm_cmpeq_ps(vecA, vecB);

   // bitwise AND. 
   // This is equivalent to vecF[i] = (vecA[i] == vecB[i]) ? vecE[i] : 0
   v4sf vecF = _mm_and_ps(mask, vecE);

   // bitwise OR and ANDNOT.
   // equivalent to vecG[i] = (vecA[i] == vecB[i]) ? vecE[i] : vecD[i];
   v4sf vecG = _mm_or_ps(_mm_and_ps(mask, vecE), 
                         _mm_andnot_ps(mask, vecD));

   // vecH[i] = sqrt(vecE[i]);
   v4sf vecH = _mm_sqrt_ps(vecE);

   // vecI[i] approx 1.0 / sqrt(vecE[i]);
   v4sf vecI = _mm_rsqrt_ps(vecE);

   // vecJ[i] approx 1.0 / vecAA[i];
   v4sf vecJ = _mm_rcp_ps(vecAA);

   v4sf vecK = 1.0 / vecAA;

   // vecL is a permutation of vecA. 
   v4sf vecL = _mm_shuffle_ps(vecA, vecA, _MM_SHUFFLE(1,0,3,2) );

   ////////////////////////////// output ///////////////////////////////

   PRINT(vecA);
   PRINT(vecAA);
   PRINT(vecB);
   PRINT(arrayB);
   PRINT(vecC);
   PRINT(vecD);
   PRINT(vecE);
   PRINT(vecF);
   PRINT(vecG);
   PRINT(vecH);
   PRINT(vecI);
   PRINT(vecJ);
   PRINT(vecK);
   PRINT(vecL);

   return 0;
}

void print(const v4sf& vec, const char* name)
{
     union { v4sf vector; float array[4]; } value;

     value.vector = vec;

     print(value.array, name);
}

void print(const float* vec, const char* name)
{
     cout << "\n" << name << endl;

     for (int i = 0; i < 4; ++i) { cout << "\t" << vec[i] << endl; }
}



Output:
 
vecA:
    0
    1
    2
    3

vecAA:
    4
    2
    3
    6

vecB:
    0
    2
    4
    6

arrayB:
    0
    2
    4
    6

vecC:
    0
    4
    8
    12

vecD:
    0
    3.5
    7
    10.5

vecE:
    1
    6
    9
    11

vecF:
    1
    0
    0
    0

vecG:
    1
    3.5
    7
    10.5

vecH:
    1
    2.44949
    3
    3.31662

vecI:
    0.999878
    0.408264
    0.333313
    0.301514

vecJ:
    0.249939
    0.499878
    0.333313
    0.166656

vecK:
    0.25
    0.5
    0.333333
    0.166667

vecL
    2
    3
    0
    1



To understand the shuffle command in part L of the example, refer to this documentation for a more general usage of the shuffle operation.

Studying the example above should give you a basic sense of how to use some of the SSE instructions. Notice the definition of the v4sf data type, which is a vector of size 16 bytes. Also note that each operation performed above on vectors has the form _mm_operation_ps(), but there are other types of operations. If you read through the xmmintrin.h header, you will see that there are many more operations available. Reading through the header and doing a few web searches for specific intrinsic functions is an easy way to learn about the details of SSE.

For an idea of how SSE can be used to solve a real problem, consider the following partial example. Suppose we decide to step some particles forward in space using $$!\mathbf{r}_{i+1} = \mathbf{r}_{i} + \mathbf{v}_{i}\delta t + \frac{1}{2}\mathbf{a}_{i}\delta t^2. $$ Ignore the fact that this isn’t the best expression to use, in general. We could create particle packets containig four particles, like this:
struct particle4
{
    v4sf x;
    v4sf y;
    v4sf z;
    v4sf vx;
    v4sf vy;
    v4sf vz;
    v4sf ax;
    v4sf ay;
    v4sf az;
}


and then step four particles forward during each iteration of a for loop using
// particles[] is an vector of particle4 objects
// the step size, delta_t is already defined

const v4sf dt = _mm_set1_ps(delta_t);

const v4sf dt2 = _mm_set1_ps(0.5 * delta_t * delta_t);

for (int i = 0; i < N; ++i)
{
    particles[i].x = particles[i].x + dt * particles[i].vx + dt2 * particles[i].ax;
    particles[i].y = particles[i].y + dt * particles[i].vy + dt2 * particles[i].ay;
    particles[i].z = particles[i].z + dt * particles[i].vz + dt2 * particles[i].az;
}

// then update vx, vy, vz, ax, ay, az (not shown)



Using OpenMP to spread the work over several threads would further improve performance.

Note: SSE2 and SSE3 merely add more instructions on top of SSE. On the other hand, the newer AVX instructions use 256 bit registers, so they are able to operate on 8 single precision floats or 4 double precision floats simultaneously, while AVX 2 will have 512 bit registers! AVX is quite similar to SSE in terms of usage. For more information, see avxintrin.h.

139 Responses to “Vectorization with SSE”

  1. Williamadhef Says:

    Register an account on Bybit and receive exclusive rewards with the Bybit referral program! Additionally, get a bonus of up to 6,045 USDT using the link – tinyurl.com/bddw5ye7

  2. Joshuagem Says:

    play, win, +2,500 coins using our link – tinyurl.com/592dn2td

  3. WesleyPoect Says:

    ??????? ?????????? ?????????? ???? ??? ????? ??????? ?????? ???????????????? https://???????????????????.??/katalog/oprokidyvateli-kontejnerov-i-telezhek/

    ???, ???????? ???????? ? ????????????? ? ???????????? ?? ???????????? ???????? ???????, ???? – ?? ???????????????????? ???????????? https://???????????????????.??/katalog/mashina-mojki/mashina-mojki-barabannogo-tipa-mmb-2000

    ?? ???????? ???????? ???????????? ???????????? ???????? ?????????????? ? ????????????? ???? ????? https://???????????????????.??/katalog/konvejera-z-obraznye/konvejera-razdelochnye-inspekcionnye

    ?????? ?????????? ? ?????? ?????????? ? ??????? ???????? ??? ????????????????? https://???????????????????.??/katalog/konvejera-z-obraznye/konvejera-razdelochnye-inspekcionnye

    ? ????????????? ?????????? ???? ?????????? ??????????? ?????? ??? ??????? ????????? https://???????????????????.??/katalog/konvejera-z-obraznye/konvejer-fasovochnyj-kf-3500

    ??? ??????? ??? ??????????, ???? ??? ???? ????? ??????? ??????????? ???????? https://???????????????????.??/katalog/kamera-df/kamera-defrostacii-kd-4000

    ?????? ??????? ? ????????????????? https://???????????????????.??/katalog/bunkera-nakopitelnye-priemnye/farshemeshalka-smesitel-tip-farsh-150-aisi-304

    ??????? ?????????? ? ??????? https://???????????????????.??/katalog/trapy-zhirouloviteli-napolnye-aisi-304/trap-shhelevoj-aisi-304

    ?????? ??? ????????????? ? ????????? ????? ? ?????????????? ? ???????????? ????? ??????????? ????????????? ??????? ??? ????????????? ????????????

    ??? 66 ??????????? ?????????????? ??????????-???????????? ??????? ??????? ????????? ?? ?????????, ?????????? ??????????????? ??????????????? ??????????? ? ?????, ?????? ?? ????????, ?????????? ???????????????

    ??? 624 https://???????????????????.??/katalog/kamera-df/kopiya-kamera-defrostacii-kd-5000

    131 ?????????? ? https://???????????????????.??/katalog/mashina-mojki/mashina-mojki-barabannogo-tipa-mmb-20001

    ? https://???????????????????.??/katalog/konvejera-z-obraznye/konvejer-fasovki-produkcii-v-banku-kfb-3

    ?????????????? ?????????????? ?????? ? ??????????? ????????? https://???????????????????.??/katalog/slajser-universalnyj-dlya-narezki-myasa-ryby-sl-2000

    ? ?????? ??????????? ??????????? ?? ??????? ????? ??????????? ?????????????? ??????? ? ????????? ??????? ??? ???????????

    ???? ??????????????? ????????? ? ??????????? ???? ?????? ??????????????? ???????????? ??????????? – ?? ????????? ?????????????? ??? ??????????? ??????????? ??????? ??????? https://???????????????????.??/katalog/konvejera-z-obraznye/konvejer-fasovochnyj-kf-3500

  4. BruceRob Says:

    ?????? ????? ?????????? ??????? ???? ? ??????? ??? ????????????? ??????? ?? ??????, ???????? ?????????? ??? ????????? ??????? ? ???? ? ????, ? ????????? ?????? ? ? ?????? xn—-8sbbqwjb8ce.xn--p1ai/

    6 xn—-8sbbqwjb8ce.xn--p1ai/
    3 xn—-8sbbqwjb8ce.xn--p1ai/
    7 xn—-8sbbqwjb8ce.xn--p1ai/
    ??????? ????????? ????????? ?????? ????????????? ??????????????? ?? ???????????????? ?????????? ??? ?? ?????? ????????????? ???? ? ?????? ??? ??????? ?????????? ? ????????? ?????? ?????????? 6 xn—-8sbbqwjb8ce.xn--p1ai/
    3 xn—-8sbbqwjb8ce.xn--p1ai/
    12 xn—-8sbbqwjb8ce.xn--p1ai/

    ???? ?? ????? ?????? ???? ?? ?????? ????? 804010801, ?? ????????-??????? ???????? ??????? ??? ????????? ???????? ??????? xn—-8sbbqwjb8ce.xn--p1ai/
    ?? ??????????? ????? ???????? ?? ??????? ????????? ???? ? ????????? ?????????????? ?????? ?? ????? ?????? xn—-8sbbqwjb8ce.xn--p1ai/
    ?, ????? ???????, ??????? ?????? ?? ?????? ????? 804010801 ?? ???????? ??????????? xn—-8sbbqwjb8ce.xn--p1ai/
    ?? ???????? ?????? ????????????????????? ??????????? ???????? ?????? ?????? ??????! ?????? ? ?????????? ?? ?????????? ?? ?????????????? ?????? ????, ????????????? ?????? – ??? ??? ??????? xn—-8sbbqwjb8ce.xn--p1ai/
    xn—-8sbbqwjb8ce.xn--p1ai/

    ?????????? xn—-8sbbqwjb8ce.xn--p1ai/
    ??????????????? ?? ????? ??? ???????? ? ?????? xn—-8sbbqwjb8ce.xn--p1ai/
    ????????? ?????? ????????? ???????????? ???????, ??????? ????????? ????????????? ??????? xn—-8sbbqwjb8ce.xn--p1ai/
    ?????? ???????? ????????????? ????????? ? ????????? ????????? ?? ????????? ?????????? xn—-8sbbqwjb8ce.xn--p1ai/
    ??? ??????????? ?????????? ????? ???????????? ???? xn—-8sbbqwjb8ce.xn--p1ai/

    ??? ????????? ???????????? ?? ????? ????????? ???????? ?????? ???????????? ???????, ??? ????? ???????? ????????? xn—-8sbbqwjb8ce.xn--p1ai/
    ??????? ?????? ?????? ?? ?????, ???? ? ???? ????? ????? ??????, ??? ?? ?????????, ??? ? ?????? xn—-8sbbqwjb8ce.xn--p1ai/

    ??????????? ??????? ?????????????? ?????? xn—-8sbbqwjb8ce.xn--p1ai/
    ???? ?? ???????? ??????? ??????? ????????, ???????? ??????? ????????? ? ?????????????? ?????????? ??????? xn—-8sbbqwjb8ce.xn--p1ai/
    ???????? ? ????????????? ??? xn—-8sbbqwjb8ce.xn--p1ai/
    ??????? ???????????? ? ??????, ??????????????? ?? ????????????? xn—-8sbbqwjb8ce.xn--p1ai/
    xn—-8sbbqwjb8ce.xn--p1ai/
    xn—-8sbbqwjb8ce.xn--p1ai/
    xn—-8sbbqwjb8ce.xn--p1ai/

  5. KennethZet Says:

    ???????????? ?????? ?????????????? ?? ??????????? ????????????, ? ??????? ???????????? ???????????? ??????????? ???????? ?????? https://????????.??/stoleshniza

    ?????????? ??????? ????????? ??????? ???? ??????????? ??????????? ?????? ?? ??????????????? ?????? ? ?????????????? ????????? https://????????.??/dveri

    ?????, ???????, ????????, ???????, ???????? ?????, ????????? ??? ?????????? ??????, ????????? ???????? ??? ?????? ??????????? ??????? – ?? ??? ?? ?? ?? ?????????? ???? ?????, ???????? ????? ???????? ? ????? ? ?????? ????? ????????? ?? ?????, ????? ? ???????????? https://????????.??/kyhni

    ????????? ??????? ???????????? ?????? ?? ????????? ??????????, ???????? ??????? ? ??????? ??????????? https://????????.??/kyhni

    ?????? ?????????? ???????? https://????????.??/vannaia

    -50% ?? ?????? Vision https://????????.??/detskaya

    ??? ???????? ??????:

    ?? -35% ?? ?????? ?????? ????????? Ponte ? Ponte C https://????????.??/

    ? ??? ?????????? ??????? ????? — ??? ??????? ????????? ? ?????? ?????????? ????????????? ?????? ??????? ????????? https://????????.??/prihozhie

    ???????, ???? ?????????? ?????????, ?????? ????-?? ?????? ? ??????????, ?? ? ?? ?? ????? ??????? ???????? https://????????.??/detskaya

    ?????? ?????? ???????? ??????? ?? ??????? ????? ? ????? ?? ???? https://????????.??/kyhni

    ??????? ????? ???? ???? — ?????? ?????????? ????????, ??????? https://????????.??/moiki

  6. RobertWep Says:

    ???????????? ???? ????????, ?? ????? ???????? ? ? ???, ??? ?????????? ????? ????????????? ????? ??????????????? ?????????, ??? ???????, ??????? ? ????? ??? ?????????, ??????? ???????? ??????????? ????????????? ????? ??????????? ???????? ?? ?????????? ???????? ??? ????????? https://???-???.??/products/korob-samosbornyi-360kh360kh20mm

  7. Scot Gelman Says:

    Hey, you used to write magnificent, but the last several posts have been kinda boring… I miss your great writings. Past few posts are just a little bit out of track! come on!

  8. Jean Saulters Says:

    F*ckin’ awesome things here. I am very satisfied to peer your post. Thank you so much and i’m taking a look forward to touch you. Will you please drop me a e-mail?

  9. Arvilla Buchs Says:

    Good write-up, I am regular visitor of one’s web site, maintain up the nice operate, and It’s going to be a regular visitor for a long time.

  10. Zoe Mitschelen Says:

    Thanks for sharing superb informations. Your site is so cool. I am impressed by the details that you’ve on this site. It reveals how nicely you understand this subject. Bookmarked this web page, will come back for more articles. You, my pal, ROCK! I found simply the info I already searched all over the place and just could not come across. What a perfect site.

  11. Darwin Pillow Says:

    I like what you guys are up also. Such clever work and reporting! Keep up the excellent works guys I have incorporated you guys to my blogroll. I think it will improve the value of my web site :).

  12. Margot Esterline Says:

    It is actually a great and helpful piece of information. I’m happy that you just shared this helpful information with us. Please keep us up to date like this. Thank you for sharing.

  13. Bobby Eslick Says:

    Its wonderful as your other posts : D, regards for putting up. “Even Albert Einstein reportedly needed help on his 1040 form.” by Ronald Reagan.

  14. Lorri Omary Says:

    Dead pent content material , regards for selective information .

  15. Elli Venhorst Says:

    I really appreciate this post. I have been looking all over for this! Thank goodness I found it on Bing. You’ve made my day! Thx again!

  16. Cary Lajoye Says:

    Good – I should definitely pronounce, impressed with your web site. I had no trouble navigating through all tabs and related info ended up being truly easy to do to access. I recently found what I hoped for before you know it at all. Reasonably unusual. Is likely to appreciate it for those who add forums or anything, website theme . a tones way for your customer to communicate. Excellent task.

  17. Gonzalo Theam Says:

    Very interesting details you have mentioned , thanks for putting up. “Nothing ever goes away.” by Barry Commoner.

  18. Anderson Criddle Says:

    I have recently started a website, the information you offer on this website has helped me tremendously. Thanks for all of your time & work. “A physicist is an atom’s way of knowing about atoms.” by George Wald.

  19. Felicita Pendegraft Says:

    Thanks for the sensible critique. Me & my neighbor were just preparing to do a little research on this. We got a grab a book from our area library but I think I learned more clear from this post. I’m very glad to see such wonderful information being shared freely out there.

  20. Hannelore Serres Says:

    Thanks for the sensible critique. Me & my neighbor were just preparing to do a little research on this. We got a grab a book from our local library but I think I learned more clear from this post. I’m very glad to see such magnificent info being shared freely out there.

  21. Hiedi Trine Says:

    Some genuinely superb content on this website, regards for contribution. “We are always in search of the redeeming formula, the crystallizing thought.” by Etty Hillesum.

  22. Moon Vitale Says:

    You have noted very interesting points ! ps nice web site . “I’m going to a special place when I die, but I want to make sure my life is special while I’m here.” by Payne Stewart.

  23. Lovetta Fiorica Says:

    I like what you guys are up also. Such smart work and reporting! Keep up the excellent works guys I’ve incorporated you guys to my blogroll. I think it’ll improve the value of my website :).

  24. Marty Traughber Says:

    I consider something truly special in this site.

  25. Randi Witbeck Says:

    Just want to say your article is as astounding. The clarity in your post is just spectacular and i could assume you are an expert on this subject. Fine with your permission let me to grab your feed to keep up to date with forthcoming post. Thanks a million and please carry on the rewarding work.

  26. Brooks Mirando Says:

    Thanks for sharing superb informations. Your site is so cool. I am impressed by the details that you have on this site. It reveals how nicely you understand this subject. Bookmarked this website page, will come back for extra articles. You, my friend, ROCK! I found simply the info I already searched everywhere and simply could not come across. What an ideal web-site.

  27. Myles Blethen Says:

    I will immediately grab your rss as I can not find your email subscription link or newsletter service. Do you’ve any? Kindly allow me recognize in order that I may subscribe. Thanks.

  28. Jamila Uselman Says:

    Whats up very cool web site!! Guy .. Excellent .. Wonderful .. I will bookmark your website and take the feeds additionally…I am satisfied to search out so many helpful information right here in the put up, we’d like work out more strategies on this regard, thanks for sharing.

  29. Tony Mecias Says:

    Only wanna input that you have a very nice website , I love the design it actually stands out.

  30. Zenia Lanciotti Says:

    You are my inhalation , I possess few blogs and rarely run out from to post .

  31. Madelene Pinkert Says:

    Thank you for sharing excellent informations. Your web-site is very cool. I am impressed by the details that you have on this site. It reveals how nicely you understand this subject. Bookmarked this web page, will come back for extra articles. You, my friend, ROCK! I found just the information I already searched all over the place and just couldn’t come across. What a great website.

  32. Mikel Alderton Says:

    Thanks for sharing excellent informations. Your website is so cool. I am impressed by the details that you’ve on this blog. It reveals how nicely you understand this subject. Bookmarked this website page, will come back for extra articles. You, my pal, ROCK! I found just the info I already searched all over the place and just couldn’t come across. What a perfect web site.

  33. Max Tidd Says:

    I was looking at some of your blog posts on this website and I believe this internet site is real instructive! Continue putting up.

  34. Forrest Eberheart Says:

    But a smiling visitor here to share the love (:, btw great style and design .

  35. Mauro Kochen Says:

    I needed to create you the very small observation just to thank you so much again with the beautiful tricks you have shown in this case. It was simply pretty open-handed with people like you in giving easily all that a lot of folks might have offered as an e-book to make some profit on their own, especially considering the fact that you could possibly have done it if you ever wanted. The suggestions also worked to provide a fantastic way to be sure that someone else have the identical dream much like my personal own to understand whole lot more pertaining to this issue. I’m sure there are several more fun instances in the future for individuals who examine your blog.

  36. Dirk Campagnone Says:

    Excellent read, I just passed this onto a colleague who was doing some research on that. And he just bought me lunch because I found it for him smile Thus let me rephrase that: Thank you for lunch! “Do you want my one-word secret of happiness–it’s growth–mental, financial, you name it.” by Harold S. Geneen.

  37. MichaelFuect Says:

    Feed your cute capybara in this game in telegram and get real money for it tinyurl.com/5bhfrnj9

  38. Edwardrulty Says:

    Make a piggy farm in this game in telegram and get real money for it in cryptocurrency tinyurl.com/mvwbwyfw

  39. JeremyIdona Says:

    Have you heard how many people made a lot of money playing NOTCOIN? Play a new game and earn real money in cryptocurrency. tinyurl.com/4wcykaas

Leave a Reply