2014-05-20 59 views
3

我已经使用OpenMP编写了一个并行程序。它使用两个线程,因为我的笔记本电脑是双核心的,线程做了很多矩阵操作,所以它们是CPU绑定的。线程间没有数据共享。程序的单个实例运行得非常快。但是当我同时运行同一程序的多个实例时,性能下降。这是一个阴谋:running time vs number of parallel instances并行程序:如何找到瓶颈(CPU绑定线程)

单个实例(两个线程)的运行时间为0.78秒。两个实例(总共四个线程)的运行时间是2.06,是0.78的两倍多。之后,运行时间与实例数(线程数)成比例地增加。

下面是其中一个实例的时间配置文件时,多个平行运行:

profile

有人能提出见解,有什么可以怎么回事?该配置文件显示,OpenMP占用了50%的时间。那是什么意思?

+1

没有任何代码只能从水晶球猜测。 –

+0

您观察到的是两个不同进程之间的上下文切换,每个进程都使用两个cpus上的两个线程运行。这种缩放与您的应用程序中的瓶颈无关。 – Bort

+0

Yout通常不能说明矩阵操作是CPU绑定的。实际上很少。如果做得对,矩阵乘法是受CPU限制的(就像LU和Cholesky因式分解一样),但其他很多不是。 –

回答

3

与@Bort所说的类似,由于您有两个内核,因此您创建了多线程应用程序(两个线程)。

这意味着只有一个程序实例运行时(理想情况下)它将使用整个CPU。

但是,如果应用程序的两个实例正在运行,则没有更多可用资源。他们每人需要两次的时间。相同的更多的实例。

如果不增加每个实例可用的内核数(即每个实例保持2个,而不是缩小的百分比),则无法解决此问题。

+0

我认为你的意思是“整个CPU” – user3288829

+0

@ user3288829是的,更正了 – soandos

+0

使用taskset,我现在可以在4秒钟内并行运行64个,而38秒(帖子内图)。 – user1274878