代码之家  ›  专栏  ›  技术社区  ›  Ahmed

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

  •  10
  • Ahmed  · 技术社区  · 15 年前

    本样本 code 比较了四核处理器上的串行方法和线程方法。代码只使用getPixel()从4个图像中读取所有像素。 我发现它的速度大约是65%,为什么它不等于75%,因为我有4个内核,而且它们都被充分利用了?

    附笔:

    您能检查代码吗,因为我不做任何I/O,而且机器上没有其他进程工作(正常的Windows进程)

    6 回复  |  直到 13 年前
        1
  •  4
  •   kemiller2002    15 年前

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

    1. 管理不同线程的开销。
    2. 其他进程同时使用系统中的资源。
        3
  •  2
  •   Lasse V. Karlsen    15 年前

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

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

    此外,还有一些与旋转线程和维护线程相关的开销,因此当您开始并行时,您将无法获得完整的核心使用,尽管在这种情况下,这可能不是一个很大的因素。

        4
  •  2
  •   nos    15 年前

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

    • 创建/启动/停止线程的时间。
    • 完成的额外工作(如锁定/递增)
    • 并非所有资源都可以完全并行,例如内存访问或读/写文件。
    • 操作系统和其他应用程序有时可能需要一些处理器时间。
        5
  •  1
  •   Daniel Rose    15 年前
    1. 您正在操作系统中运行它。还有其他进程正在运行。这些会占用一些CPU时间。
    2. 也许您不再受CPU限制,而是受IO限制(内存带宽、磁盘带宽等)。
    3. 线程(和线程切换)、编组等总是会有一些开销。

    总的来说,根据我的并行编程经验,如果您的运行时间减少了65%,那就很好了。

        6
  •  1
  •   Tim Cooper    13 年前

    因为还有其他因素要考虑。比如内存和I/O带宽/竞争、线程上下文切换开销等。