2010-05-12 50 views
10

此示例code在四核处理器上将串行方法与线程方法进行了比较。该代码仅使用GetPixel()从4张图像中读取所有像素。 我发现加速度大概在65%左右,为什么它不等于75%,因为我有4个内核,并且它们都被充分利用了?在四核上使用线程加速代码65%?

PS:

可以检查代码,因为我没有做任何I/O,并没有其他进程在机器上工作(正常的Windows进程)

+2

大量的RAM被触及,CPU将开始通过总线进行战斗。 – 2010-05-12 17:56:48

回答

4

它可以是任何数量的东西。一个想到的夫妇

  1. 管理不同线程的开销。
  2. 其他进程正在同时使用系统中的资源。
+0

我确定没有其他进程正在使用处理器 – 2010-05-12 12:50:12

+0

线程管理导致预期性能下降的可能性仍然很大。 – kemiller2002 2010-05-12 12:58:35

2

很可能它必须与某些数据结构或文件上的其他线程竞争,以免得到100%的并行执行。

例如,如果您要在四核上以4路并行方式运行网页下载网页类型的操作,并且服务器一次只允许同一个IP地址同时下载1次,你根本不会得到任何加速。

另外,还有一些与旋转线程和维护它们有关的开销,所以当你开始并行执行时,你不会得到完整核心的使用,尽管在这种情况下它很可能不是一个大的因素。

1

因为还有其他因素需要考虑。像内存和I/O带宽/争用,线程上下文切换开销等。

1
  1. 您正在操作系统中运行它。还有其他进程正在运行。这些会占用一些CPU时间。
  2. 也许你不再受CPU限制,但受IO限制(内存带宽,磁盘带宽......)。
  3. 时时会出现一些开销线程(和线程切换),编组等

总体而言,我的并行编程经验,如果你得到的少65%流逝的时间,这是非常好。

2

线程有开销,并不是所有东西都能并行运行。

  • 创建/启动/停止线程的时间。
  • 完成的额外工作(如锁定/递增)
  • 并非每种资源都可能完全可并行化,内存访问或读/写文件。
  • 操作系统和其他应用程序可能需要一些处理器时间。