Advertisement
Guest User

Stackoverflow: 25078285

a guest
Aug 1st, 2014
2,709
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3. #include <x86intrin.h>
  4.  
  5. int main(int argc, char* argv[]) {
  6.  
  7.    using namespace std;
  8.    uint64_t size=1<<20;
  9.  
  10.    uint64_t* buffer = new uint64_t[size/8];
  11.    char* charbuffer=reinterpret_cast<char*>(buffer);
  12.    for (unsigned i=0;i<size;++i) charbuffer[i]=rand()%256;
  13.  
  14.    uint64_t count,duration;
  15.    chrono::time_point<chrono::system_clock> startP,endP;
  16.    {
  17.       uint64_t c0 = 0;
  18.       uint64_t c1 = 0;
  19.       uint64_t c2 = 0;
  20.       uint64_t c3 = 0;
  21.       startP = chrono::system_clock::now();
  22.       for( unsigned k = 0; k < 10000; k++){
  23.          // Tight unrolled loop with unsigned
  24.          for (uint64_t i=0;i<size/8;i+=4) {
  25.             uint64_t r0 = buffer[i + 0];
  26.             uint64_t r1 = buffer[i + 1];
  27.             uint64_t r2 = buffer[i + 2];
  28.             uint64_t r3 = buffer[i + 3];
  29.             __asm__(
  30.                 "popcnt %4, %4  \n\t"
  31.                 "add %4, %0     \n\t"
  32.                 "popcnt %5, %5  \n\t"
  33.                 "add %5, %1     \n\t"
  34.                 "popcnt %6, %6  \n\t"
  35.                 "add %6, %2     \n\t"
  36.                 "popcnt %7, %7  \n\t"
  37.                 "add %7, %3     \n\t"
  38.                 : "+r" (c0), "+r" (c1), "+r" (c2), "+r" (c3)
  39.                 : "r"  (r0), "r"  (r1), "r"  (r2), "r"  (r3)
  40.             );
  41.          }
  42.       }
  43.       count = c0 + c1 + c2 + c3;
  44.       endP = chrono::system_clock::now();
  45.       duration=chrono::duration_cast<std::chrono::nanoseconds>(endP-startP).count();
  46.       cout << "False Chain 0:\t" << count << '\t' << (duration/1.0E9) << " sec \t"
  47.            << (10000.0*size)/(duration) << " GB/s" << endl;
  48.    }
  49.    {
  50.       uint64_t c0 = 0;
  51.       uint64_t c1 = 0;
  52.       uint64_t c2 = 0;
  53.       uint64_t c3 = 0;
  54.       startP = chrono::system_clock::now();
  55.       for( unsigned k = 0; k < 10000; k++){
  56.          // Tight unrolled loop with uint64_t
  57.          for (uint64_t i=0;i<size/8;i+=4) {
  58.             uint64_t r0 = buffer[i + 0];
  59.             uint64_t r1 = buffer[i + 1];
  60.             uint64_t r2 = buffer[i + 2];
  61.             uint64_t r3 = buffer[i + 3];
  62.             __asm__(
  63.                 "popcnt %4, %%rax   \n\t"
  64.                 "add %%rax, %0      \n\t"
  65.                 "popcnt %5, %5      \n\t"
  66.                 "add %5, %1         \n\t"
  67.                 "popcnt %6, %6      \n\t"
  68.                 "add %6, %2         \n\t"
  69.                 "popcnt %7, %7      \n\t"
  70.                 "add %7, %3         \n\t"
  71.                 : "+r" (c0), "+r" (c1), "+r" (c2), "+r" (c3)
  72.                 : "r"  (r0), "r"  (r1), "r"  (r2), "r"  (r3)
  73.                 : "rax"
  74.             );
  75.          }
  76.       }
  77.       count = c0 + c1 + c2 + c3;
  78.       endP = chrono::system_clock::now();
  79.       duration=chrono::duration_cast<std::chrono::nanoseconds>(endP-startP).count();
  80.       cout << "False Chain 1:\t" << count << '\t' << (duration/1.0E9) << " sec \t"
  81.            << (10000.0*size)/(duration) << " GB/s" << endl;
  82.    }
  83.    {
  84.       uint64_t c0 = 0;
  85.       uint64_t c1 = 0;
  86.       uint64_t c2 = 0;
  87.       uint64_t c3 = 0;
  88.       startP = chrono::system_clock::now();
  89.       for( unsigned k = 0; k < 10000; k++){
  90.          // Tight unrolled loop with uint64_t
  91.          for (uint64_t i=0;i<size/8;i+=4) {
  92.             uint64_t r0 = buffer[i + 0];
  93.             uint64_t r1 = buffer[i + 1];
  94.             uint64_t r2 = buffer[i + 2];
  95.             uint64_t r3 = buffer[i + 3];
  96.             __asm__(
  97.                 "popcnt %4, %%rax   \n\t"
  98.                 "add %%rax, %0      \n\t"
  99.                 "popcnt %5, %%rax   \n\t"
  100.                 "add %%rax, %1      \n\t"
  101.                 "popcnt %6, %6      \n\t"
  102.                 "add %6, %2         \n\t"
  103.                 "popcnt %7, %7      \n\t"
  104.                 "add %7, %3         \n\t"
  105.                 : "+r" (c0), "+r" (c1), "+r" (c2), "+r" (c3)
  106.                 : "r"  (r0), "r"  (r1), "r"  (r2), "r"  (r3)
  107.                 : "rax"
  108.             );
  109.          }
  110.       }
  111.       count = c0 + c1 + c2 + c3;
  112.       endP = chrono::system_clock::now();
  113.       duration=chrono::duration_cast<std::chrono::nanoseconds>(endP-startP).count();
  114.       cout << "False Chain 2:\t" << count << '\t' << (duration/1.0E9) << " sec \t"
  115.            << (10000.0*size)/(duration) << " GB/s" << endl;
  116.    }
  117.    {
  118.       uint64_t c0 = 0;
  119.       uint64_t c1 = 0;
  120.       uint64_t c2 = 0;
  121.       uint64_t c3 = 0;
  122.       startP = chrono::system_clock::now();
  123.       for( unsigned k = 0; k < 10000; k++){
  124.          // Tight unrolled loop with uint64_t
  125.          for (uint64_t i=0;i<size/8;i+=4) {
  126.             uint64_t r0 = buffer[i + 0];
  127.             uint64_t r1 = buffer[i + 1];
  128.             uint64_t r2 = buffer[i + 2];
  129.             uint64_t r3 = buffer[i + 3];
  130.             __asm__(
  131.                 "popcnt %4, %%rax   \n\t"
  132.                 "add %%rax, %0      \n\t"
  133.                 "popcnt %5, %%rax   \n\t"
  134.                 "add %%rax, %1      \n\t"
  135.                 "popcnt %6, %%rax   \n\t"
  136.                 "add %%rax, %2      \n\t"
  137.                 "popcnt %7, %7      \n\t"
  138.                 "add %7, %3         \n\t"
  139.                 : "+r" (c0), "+r" (c1), "+r" (c2), "+r" (c3)
  140.                 : "r"  (r0), "r"  (r1), "r"  (r2), "r"  (r3)
  141.                 : "rax"
  142.             );
  143.          }
  144.       }
  145.       count = c0 + c1 + c2 + c3;
  146.       endP = chrono::system_clock::now();
  147.       duration=chrono::duration_cast<std::chrono::nanoseconds>(endP-startP).count();
  148.       cout << "False Chain 3:\t" << count << '\t' << (duration/1.0E9) << " sec \t"
  149.            << (10000.0*size)/(duration) << " GB/s" << endl;
  150.    }
  151.    {
  152.       uint64_t c0 = 0;
  153.       uint64_t c1 = 0;
  154.       uint64_t c2 = 0;
  155.       uint64_t c3 = 0;
  156.       startP = chrono::system_clock::now();
  157.       for( unsigned k = 0; k < 10000; k++){
  158.          // Tight unrolled loop with uint64_t
  159.          for (uint64_t i=0;i<size/8;i+=4) {
  160.             uint64_t r0 = buffer[i + 0];
  161.             uint64_t r1 = buffer[i + 1];
  162.             uint64_t r2 = buffer[i + 2];
  163.             uint64_t r3 = buffer[i + 3];
  164.             __asm__(
  165.                 "popcnt %4, %%rax   \n\t"
  166.                 "add %%rax, %0      \n\t"
  167.                 "popcnt %5, %%rax   \n\t"
  168.                 "add %%rax, %1      \n\t"
  169.                 "popcnt %6, %%rax   \n\t"
  170.                 "add %%rax, %2      \n\t"
  171.                 "popcnt %7, %%rax   \n\t"
  172.                 "add %%rax, %3      \n\t"
  173.                 : "+r" (c0), "+r" (c1), "+r" (c2), "+r" (c3)
  174.                 : "r"  (r0), "r"  (r1), "r"  (r2), "r"  (r3)
  175.                 : "rax"
  176.             );
  177.          }
  178.       }
  179.       count = c0 + c1 + c2 + c3;
  180.       endP = chrono::system_clock::now();
  181.       duration=chrono::duration_cast<std::chrono::nanoseconds>(endP-startP).count();
  182.       cout << "False Chain 4:\t" << count << '\t' << (duration/1.0E9) << " sec \t"
  183.            << (10000.0*size)/(duration) << " GB/s" << endl;
  184.    }
  185.  
  186.    free(charbuffer);
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement