gpt4 book ai didi

c++ - PPL - 如何配置 native 线程数?

转载 作者:可可西里 更新时间:2023-11-01 11:47:37 35 4
gpt4 key购买 nike

我正在尝试使用其 Scheduler 类来管理 PPL 中的 native 线程数,这是我的代码:

for (int i = 0; i < 2000; i ++)
{
// configure concurrency count 16 to 32.
concurrency::SchedulerPolicy policy = concurrency::SchedulerPolicy(2, concurrency::MinConcurrency, 16,
concurrency::MaxConcurrency, 32);
concurrency::Scheduler *pScheduler = concurrency::Scheduler::Create(policy);
HANDLE hShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
pScheduler->RegisterShutdownEvent(hShutdownEvent);
pScheduler->Attach();

//////////////////////////////////////////////////////////////////////////

//for (int i = 0; i < 2000; i ++)
{
concurrency::create_task([]{
concurrency::wait(1000);
OutputDebugString(L"Task Completed\n");
});
}

//////////////////////////////////////////////////////////////////////////

concurrency::CurrentScheduler::Detach();
pScheduler->Release();
WaitForSingleObject(hShutdownEvent, INFINITE);
CloseHandle(hShutdownEvent);
}

SchedulerPolicy的用法来自MSDN ,但它根本不起作用。我上面代码的预期结果是,PPL 将启动 16 到 32 个线程来执行 2000 个任务,但事实是:

通过观察控制台输出的速度,一秒内只处理了一个任务。我还尝试注释外部 for 循环并取消注释内部 for 循环,但是,这将导致创建 300 个线程,仍然不正确。如果我等待更长的时间,创建的线程会更多。

关于在 PPL 中配置并发的正确方法有什么想法吗?

最佳答案

已经证明我不应该在任务体内做concurrency::wait,当当前任务被wait暂停时,PPL工作在工作窃取模式,它会开始调度队列中的剩余任务,以最大限度地利用计算资源。

当我在实际项目中使用 concurrency::create_task 时,由于任务主体中有几个实际计算,PPL 不会再创建数百个线程。

此外,SchedulePolicy 可用于配置 PPL 可用于处理任务的虚拟处理器数量,这并不总是与 PPL 将创建的 native 线程数量相同。

假设我的 CPU 有 8 个虚拟处理器,默认情况下 PPL 只会在池中创建 8 个线程,但是当其中一些线程被 waitlock 挂起时,并且队列中还有更多任务待处理,PPL 将立即创建更多线程来执行它们(如果虚拟处理器未满载)。

关于c++ - PPL - 如何配置 native 线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40735170/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com