#ifndef PRIMEGEN_H #define PRIMEGEN_H #include /** * This is B/32: the number of 32-bit words of space used in the primegen * inner loop. This should fit into the CPU's level-1 cache. * * 2048 works well on a Pentium-100. * 3600 works well on a Pentium II-350 * 4004 works well on an UltraSPARC-I/167 * * 2012-nov (Rob): This code was written 15 years ago. Processor caches * haven't really gotten any larger. A number like 8008 works slightly * better on an Ivy Bridge CPU, but works noticeably worse on an Atom * or ARM processor. The value 4004 seems to be a good compromise for * all these processors. In any case, modern CPUs will automatically * prefetch the buffers anyway, significantly lessoning the impact of * having a poor number defined here. I tried 16016, but it crashed, and * I don't know why, but I don't care because I'm not going to use such a * large size. */ #define PRIMEGEN_WORDS 4004 typedef struct { uint32_t buf[16][PRIMEGEN_WORDS]; uint64_t p[512]; /* p[num-1] ... p[0], in that order */ int num; int pos; /* next entry to use in buf; WORDS to restart */ uint64_t base; uint64_t L; } primegen; extern void primegen_sieve(primegen *); extern void primegen_fill(primegen *); extern void primegen_init(primegen *); extern uint64_t primegen_next(primegen *); extern uint64_t primegen_peek(primegen *); extern uint64_t primegen_count(primegen *,uint64_t to); extern void primegen_skipto(primegen *,uint64_t to); #endif