我在 2 路 Windows 机器上使用 PPL(16C32T x 2 = 64 个逻辑核心)。
CurrentScheduler->GetNumberOfVirtualProcessors()
报告有 64 个处理器。concurrency::parallel_for
仅使用第一个插槽,总 CPU 使用率永远不会达到 100%。
如何用一个
parallel_for
使用所有套接字(所有NUMA节点)?
我想你搞错了...
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;
}
这只是一个概念;我还没测试过。