ysyx_22040000 李心杨 Linux calcite 6.6.19 #1-NixOS SMP PREEMPT_DYNAMIC Fri Mar 1 12:35:11 UTC 2024 x86_64 GNU/Linux 16:26:21 up 4 days 3:32, 2 users, load average: 0.85, 0.91, 0.95
42 lines
765 B
C
42 lines
765 B
C
#include <benchmark.h>
|
|
|
|
static int N;
|
|
|
|
static int ans;
|
|
static uint32_t *primes;
|
|
|
|
static inline int get(int n) {
|
|
return (primes[n >> 5] >> (n & 31)) & 1;
|
|
}
|
|
|
|
static inline void clear(int n) {
|
|
primes[n >> 5] &= ~(1ul << (n & 31));
|
|
}
|
|
|
|
void bench_sieve_prepare() {
|
|
N = setting->size;
|
|
primes = (uint32_t*)bench_alloc(N / 8 + 128);
|
|
for (int i = 0; i <= N / 32; i ++) {
|
|
primes[i] = 0xffffffff;
|
|
}
|
|
}
|
|
|
|
void bench_sieve_run() {
|
|
for (int i = 1; i <= N; i ++)
|
|
if (!get(i)) return;
|
|
for (int i = 2; i * i <= N; i ++) {
|
|
if (get(i)) {
|
|
for (int j = i + i; j <= N; j += i)
|
|
clear(j);
|
|
}
|
|
}
|
|
ans = 0;
|
|
for (int i = 2; i <= N; i ++)
|
|
if (get(i)) {
|
|
ans ++;
|
|
}
|
|
}
|
|
|
|
int bench_sieve_validate() {
|
|
return ans == setting->checksum;
|
|
}
|