【发布时间】:2016-02-07 07:56:27
【问题描述】:
我将尝试并行化以下简单 while 使用 OpenMP 循环成两个线程 (我的第一次步行尝试使用这项技术)。我尝试同时使用sections 和tasks。尽管我把它分成两个线程并产生了正确的结果,但 性能 慢得令人无法接受。
while ( tortoise != hare ) {
tortoise = f ( tortoise );
hare = f ( f ( hare ) );
}
注意:f 是函数对象的const &(即它有一个T operator()(const T &r))
operator()的实现如下(d是函数对象的成员变量):
T operator() ( const T &r ) const {
return ( ( r % d ) * 10 );
}
我的第一个想法是创建线程的开销。所以我在封闭函数的最开始创建了team(它本身只被调用一次,而上面的while-loop本身可以有很多迭代(它是Floyd cycle detection algorithm的一部分)。
我在这里省略了我所有的 #pragma omp ... 尝试,因为它们都导致性能不佳。
编辑:
根据 @templatetypedef 的回答,我尝试了 Brent 算法。因为我需要注入一些计算弗洛伊德的第二个和第三个while-loop (构建一个预循环和循环值的数字数组,如以及使用霍纳方案计算多项式) Brent 没有给我添加此代码的任何要点。因此我更喜欢弗洛伊德。完整代码见here。
【问题讨论】:
-
f是如何实现的?考虑到每个线程基本上都会调用 f 然后做大量工作以与另一个线程同步,你真的认为多线程会加快速度吗? -
@templatetypedef 因为我认为这两个语句可以并行处理,所以我想在多核 CPU 上尝试一下。我已将
T operator()(const T &r)的实现添加到问题中。
标签: c++ multithreading algorithm performance openmp