Advertisement
zhangsongcui

prime

Oct 13th, 2019
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.07 KB | None | 0 0
  1. #include <vector>
  2. #include <immintrin.h>
  3.  
  4. int main() {
  5.     std::vector<__m256i> primes = { _mm256_setr_epi32(2, ~0, ~0, ~0, ~0, ~0, ~0, ~0) };
  6.     primes.reserve(2048);
  7.    
  8.     unsigned sqr = 4;
  9.     int pos = 1;
  10.  
  11.     for (unsigned current = 3; current < uint32_t(1e2); current += 2) {
  12.         auto num = _mm256_set1_epi32(current);
  13.         if (sqr * sqr < current) {
  14.             ++sqr;
  15.         }
  16.         for (auto divisor : primes) {
  17.             auto temp = _mm256_cmpeq_epi32(
  18.                 _mm256_rem_epu32(num, divisor),
  19.                 _mm256_setzero_si256()
  20.             );
  21.             if (!_mm256_testz_si256(temp, temp)) {
  22.                 break; // not prime
  23.             }
  24.             if (unsigned(_mm256_extract_epi32(divisor, 7)) > sqr) {
  25.                 // prime number found
  26.  
  27.                 reinterpret_cast<uint32_t *>(&primes.back())[pos] = current;
  28.                 if (++pos >= 8) {
  29.                     primes.push_back(_mm256_set1_epi32(~0));
  30.                     pos = 0;
  31.                 }
  32.                 break;
  33.             }
  34.         }
  35.     }
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement