Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <immintrin.h>
- int main() {
- std::vector<__m256i> primes = { _mm256_setr_epi32(2, ~0, ~0, ~0, ~0, ~0, ~0, ~0) };
- primes.reserve(2048);
- unsigned sqr = 4;
- int pos = 1;
- for (unsigned current = 3; current < uint32_t(1e2); current += 2) {
- auto num = _mm256_set1_epi32(current);
- if (sqr * sqr < current) {
- ++sqr;
- }
- for (auto divisor : primes) {
- auto temp = _mm256_cmpeq_epi32(
- _mm256_rem_epu32(num, divisor),
- _mm256_setzero_si256()
- );
- if (!_mm256_testz_si256(temp, temp)) {
- break; // not prime
- }
- if (unsigned(_mm256_extract_epi32(divisor, 7)) > sqr) {
- // prime number found
- reinterpret_cast<uint32_t *>(&primes.back())[pos] = current;
- if (++pos >= 8) {
- primes.push_back(_mm256_set1_epi32(~0));
- pos = 0;
- }
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement