我根据来自learning go的并发pi算法计算pi数。现在我做的不同的是将大块中的工作量分开,然后在2个映射线程上并行计算(因为我的CPU有2个内核)。他们的结果被写入一个经常被减少的线程访问的队列。
问题:我还实现了非并行版本的计算,实际上 double 与多线程版本一样快!但由于它们都计算相同的结果,因此并行版本中的工作实际上必须在映射线程之间共享。
两个版本的计算代码相同:
// this is called 6 times, with a block size of 1000000
void calcPiBlock(mpf_t result, uint32 start, uint32 end) {
// the precision is 64 bit
mpf_t piItem;
mpf_init(piItem);
for (uint32 i = start; i < end; ++i) {
calcPiItem(piItem, i);
mpf_add(result, result, piItem);
}
}
inline void calcPiItem(mpf_t piItem, uint32 index) {
mpf_t dividend;
mpf_t base;
mpf_init(dividend);
mpf_init_set_d(base, -1.0);
mpf_pow_ui(dividend, base, index);
mpf_t divisor;
mpf_init_set_d(divisor, 2.0);
mpf_mul_ui(divisor, divisor, index);
mpf_add_ui(divisor, divisor, 1);
mpf_div(piItem, dividend, divisor);
mpf_mul_ui(piItem, piItem, 4);
}
使用几个printf语句,我发现在我的并行版本中用于同步的时间在总量中可以忽略不计。关闭还原线程也不会改变结果(如预期的那样)。