【问题标题】:multithreading - threads per core多线程 - 每个内核的线程数
【发布时间】:2014-06-11 08:15:53
【问题描述】:

我有这个代码:

#define threadsNum 4

DWORD WINAPI func(LPVOID vpParam)
{
    long long sum = 0;

    for(int i = 0; i < 400000 / threadsNum; i++)
    {
        for(int j = 0; j < 160000 / threadsNum; j++)
        {
            sum = sum > 1000 ? 0 : sum + 1;
        }

    }

    return 1;
}


int main()
{
    clock_t timer = clock();

    int CPUs = 4;
    DWORD_PTR threadCore = 1;
    DWORD_PTR threadID = 0;
    int addNum = 0;

    void* *threads = new void*[threadsNum];

    for (int i = 0; i < threadsNum; i++)
    {
        threadCore = 1 << addNum;
        addNum++;
        if (addNum == 4)
            addNum = 0;

        threads[i] = CreateThread(0, 0, func, NULL , 0, &threadID);
        SetThreadAffinityMask(threads[i], threadCore);
    }

    if (WaitForMultipleObjects(threadsNum, threads, true, INFINITE) == WAIT_FAILED)
        FatalAppExitA(NULL, "FAIL");


    cout<<clock() - timer<<endl;

    getchar();


    return 1;
}

我的电脑上有 4 个内核。随着threadsNum 的数量增加,时间变小。当threadsNum等于4时,输出为22325,当为8时,输出为11549。为什么?每个核心都做同样的工作。对于threadsNum = 8,每个内核都有 2 个线程,当threadsNum = 4 时它们一起做同样的工作。那么为什么它更快呢?

【问题讨论】:

  • 线程可能被抢占并且可能正在执行一些 IO...

标签: c++ windows multithreading performance


【解决方案1】:

如果在 4 核 CPU 上 8 个线程比 4 个线程快得多,那么您可能拥有一个带有超线程的 Intel CPU,它每个内核运行两个硬件线程。它通常不如实际的 8 核 CPU 快,因为每个内核上的两个线程共享一些硬件资源,但是对于像这样的简单线程有效负载,您可能会接近 2 倍的改进(并且似乎是这样做)。

【讨论】:

  • op 可以尝试从从 1 到 64 的线程数绘制执行时间 - 这会从 cpu 暴露线程模式。现代 cpu 无论如何都有循环重组和分支预测,这既有助于也隐藏了在这些合成基准上的性能。
【解决方案2】:

有 2 个主要罪魁祸首,但您必须进行更多基准测试才能了解每个罪魁祸首的贡献。

  1. 线程被 IO 阻塞的 IO 绑定任务。在这种情况下,“IO”将是内存访问。一个线程可以进行加法运算,而另一个线程被阻塞等待读取或写入。
  2. Hyperthreading。在现代处理器中,每个内核几乎可以像两个内核一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2015-04-14
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2020-12-14
    相关资源
    最近更新 更多