伪共享是什么?
TODO: 这里补点文档!!!!!! 缓存一致性、同步的代价!!!
也就是,当不同线程所访问的内存元素恰好在同一个 cache line 上时,
以下程序是经过修复后的 C 源码:
#define NUM_THREADS 4
#define PAD 8 // assume 64 byte L1 cache line size
void calc_pi_omp_v1()
{long num_steps = 0x20000000;double sum[NUM_THREADS][PAD] = { 0.0 };double step = 1.0 / (double)num_steps;int nthreads;double start = omp_get_wtime( ); omp_set_num_threads(NUM_THREADS);#pragma omp parallel{int id = omp_get_thread_num();int nthrds = omp_get_num_threads();if (id == 0) {nthreads = nthrds;}for (long i = id; i < num_steps; i += nthrds) {double x = (i + 0.5) * step;sum[id][0] += 4.0 / (1.0 + x * x);} }double pi = 0;for (int i = 0; i < nthreads; i++) {pi += sum[i][0]*step;}printf("pi: %.16g in %.16g secs\n", pi, omp_get_wtime() - start);
}
TODO: here