单线程程序显然使用多核

时间:2016-08-10 13:19:59

标签: c++ multithreading macos cpu

问题摘要:运行单线程程序时使用的所有四个核心。为什么呢?

详细信息:我在Xcode(C ++)中编写了一个非并行化程序。我正在进行并行处理,并希望了解我所做的事情是否实际上导致使用了更多内核。为此,我使用Instruments来查看核心用法。令我惊讶的是,虽然我的应用程序是单线程的,但所有四个核心都在使用。

为了测试它是否改变了性能,我将可用内核数量调低为1(你可以在乐器,首选项中进行调整),速度根本没有降低。所以(据我所知)该程序没有以任何方式进行并行化。

我找不到任何有关使用多个内核执行单线程任务意味着什么的信息。我读的仪器输出错了吗?或者单线程进程是出于某种原因在不同核心之间分流(比如在路上改变车道而不是一次在两条车道上行驶 - 即实际并行化)?

感谢任何人都可以提供的任何见解。

使用MWE进行编辑(对于最初没有这样做而道歉)。 以下是C ++代码,它可以在Xcode中编译500,000以下的素数。

#include <iostream>

int main(int argc, const char * argv[]) {
    clock_t start, end;
    double runTime;
    start = clock();
    int i, num = 1, primes = 0;
    int num_max = 500000;

    while (num <= num_max) {
        i = 2;
        while (i <= num) {
            if(num % i == 0)
                break;
                i++;
        }
        if (i == num){
            primes++;
            std::cout << "Prime: " << num << std::endl;
        }

        num++;
    }

    end = clock();
    runTime = (end - start) / (double) CLOCKS_PER_SEC;
    std::cout << "This machine calculated all " << primes << " under " << num_max << " in " << runTime << " seconds." << std::endl;

    return 0;
}

这可以在我的机器上运行36秒左右,如最终输出和手机的秒表所示。当我对它进行分析(使用从Xcode内部启动的仪器)时,它的运行时间大约为28秒。下图显示了核心用法。

instruments showing core usage with all 4 cores (with hyper threading)

现在我将可用内核数量减少到1.从分析器内重新运行(按下记录按钮),它表示运行时间为29秒;图片如下所示。

instruments output with only 1 core available

这符合我的理论,即更多内核不能提高单个线程程序的性能!不幸的是,当我用手机实际计划程序时,上面大约需要1分30秒,因此打开所有核心可以获得有意义的性能提升。

让我感到困惑的一件事是,如果你将核心数保留为1,回到Xcode并运行程序,它再说它需要大约33秒,但我的手机说需要1分50秒。因此,更改内核正在为内部时钟做些事情(可能)。

希望完全描述问题。我正在运行2015款15英寸MBP,配备2.2GHz i7四核处理器。 Xcode 7.3.1

2 个答案:

答案 0 :(得分:5)

我想假设您的答案缺乏大量信息,以便进行准确的诊断。无论如何,我会尝试向您解释IHMO最常见的原因,假设您的应用程序没有使用以多线程方式执行的第3部分组件。

我认为这可能是调度程序效果的结果。我要解释一下我的意思。

处理器的每个核心都在系统中执行一个过程并执行它以用于&#34;短的&#34;多少时间。 This是桌面操作系统中最常见的解决方案。

您的流程在单个核心上执行了这段时间,然后停止以允许其他流程继续。当你的同一个进程恢复时,它可以在另一个核心中执行(总是一个核心,但不同的核心)。因此,具有低分辨率时间的精确任务管理器可能会记录所有核心的利用率,即使它没有。

为了验证原因是否可能,我建议您查看应用程序运行时使用的CPU%。实际上,在单线程应用程序的情况下,CPU应该大约为NOT EXISTS(),在您的情况下 25%

答案 1 :(得分:0)

如果是发布版本,您的编译器可能 vectorising 并行化您的代码。您链接的库(例如标准库)也可以是线程化或矢量化的。