45 lines
1.5 KiB
C
45 lines
1.5 KiB
C
#ifndef PRIMEGEN_H
|
|
#define PRIMEGEN_H
|
|
|
|
#include <stdint.h>
|
|
|
|
/**
|
|
* 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
|