在四核上使用线程加速代码65%?

时间:2010-05-12 12:27:28

标签: c# multithreading multicore

此示例code在四核处理器上比较串行方法和线程方法。代码只使用GetPixel()来读取4个图像中的所有像素。 我发现速度提高了大约65%,为什么它不等于75%,因为我有4个核心并且所有这些都被充分利用了?

P.S:

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

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

答案 2 :(得分:2)

很可能它必须与某些数据结构或文件中的其他线程竞争,这样就不会100%并行执行。

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

此外,还有一些与启动线程并维护它们相关的开销,因此当你开始并行时你不会得到完整的核心用法,尽管在这种情况下它很可能不是一个重要的因素。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

  1. 您正在操作系统中运行它。还有其他进程在运行。这些将占用一些CPU时间。
  2. 也许你不再受CPU限制,但IO限制(内存带宽,磁盘带宽......)。
  3. 线程(和线程切换),编组等总会有一些开销。
  4. 总的来说,从我的并行编程经验来看,如果你的经过时间少了65%,那就非常好了。