2 插槽计算机上的 Microsoft PPL

问题描述 投票:0回答:1

我在 2 路 Windows 机器上使用 PPL(16C32T x 2 = 64 个逻辑核心)。

CurrentScheduler->GetNumberOfVirtualProcessors()
报告有 64 个处理器。
但是
concurrency::parallel_for
仅使用第一个插槽,总 CPU 使用率永远不会达到 100%

如何用一个

parallel_for
使用所有套接字(所有NUMA节点)?

c++ numa ppl
1个回答
0
投票

我想你搞错了...

PPL
中的concurrency::parallel_for函数使用系统的默认调度程序,因此它可能不能在所有套接字上均匀分配工作负载。

因此,您必须创建一个custom调度程序,显式地将工作分配给每个套接字。一定是这样的:

#include <ppl.h>
#include <concrt.h>

class CustomScheduler : public Concurrency::Scheduler
{
public:
    CustomScheduler()
    {
        // Number of virtual processors to the total number of logical cores.
        SetNumberOfVirtualProcessors(64);
    }

    virtual void ScheduleTask(Concurrency::TaskProc proc, void* param)
    {
        int socketIndex = GetCurrentVirtualProcessor()->GetNodeId();
        Concurrency::Task::CreateAndStart([=]() {
            proc(param);
        }, GetVirtualProcessor(socketIndex));
    }
};

int main()
{
    CustomScheduler scheduler;
    Concurrency::Scheduler::SetDefaultScheduler(&scheduler);
    concurrency::parallel_for(0, 100, [](int i) {
        // Your parallel code here.
    });

    return 0;
}

这只是一个概念;我还没测试过。

© www.soinside.com 2019 - 2024. All rights reserved.