GMP是否序列化我的多线程代码?

时间:2014-06-21 15:29:50

标签: c multithreading parallel-processing gmp

我根据来自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语句,我发现在我的并行版本中用于同步的时间在总量中可以忽略不计。关闭还原线程也不会改变结果(如预期的那样)。

0 个答案:

没有答案