ysyx-workbench/am-kernels/benchmarks/microbench/src/sieve/sieve.c
tracer-ysyx d08c2860da > compile NEMU
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
2024-03-24 16:26:21 +08:00

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;
}