2016-12-05 30 views
0

我已经构建了一个C++代码,而不用考虑以后是否需要对它进行多线程处理。我现在已经使用openMP多线程化了3个主循环。下面是性能比较提高多线程的一般技巧(使用C++)

单股(如用time从bash的测量)

real 5m50.008s 
user 5m49.072s 
sys  0m0.877s 

多线程(24个线程)

real 1m22.572s 
user 28m28.206s 
sys  0m4.170s 

使用24个核心的已通过减少实时是4.24的一个因素。当然,我没有想到代码会快24倍。我真的不知道实际会发生什么。

- 有没有一个经验法则可以让人预测一个给定的代码与一个线程相比能运行多快?

- 为改善多线程进程的性能是否有一些常用技巧?

+1

你有24芯的机器吗? – pm100

+0

@ pm100是(24个逻辑核心)。我不拥有它,它属于我的实验室。 –

回答

2

我相信你知道像屏障的成本那样明显。但很难在琐碎的事情和对某人有帮助的事情之间划清界限。这里有几个教训教训使用,如果我想更多的,我会加入他们的:

  • 总是试图尽可能长时间使用线程私有变量,认为即使裁减,只提供一小的集体成果。

  • 首选平行运行长代码段和长平行段(#pragma omp parallel ... #pragma omp for),而不是分别并行化循环(#pragma omp parallel for)。

  • 不平行化短循环。在二维迭代中,并行化外部循环通常就足够了。如果您使用collapse并行化了整个事件,请注意,OpenMP会将其线性化,引入一个融合变量并分别访问索引导致开销。

  • 使用线程私有堆。如果可能就避免共用游泳池和收藏,即使收集的不同成员将通过不同的线程独立访问。

  • 简介你的代码,看看有多少时间花在忙等待,并在那里可能发生。

  • 学习使用不同的时间表策略的后果。尝试什么更好,不要假设。

  • 如果你使用的关键部分,他们的名字。所有未命名的CS都必须等待对方。

  • 如果你的代码使用随机数,使之重现性:定义线程局部随机数发生器,以可控的方式播种的一切,在减少维持秩序。基准确定,而不是统计。

  • 浏览堆栈溢出类似的问题,例如,精彩的答案here