[英]How many threads are used by default in TParallel::For?
我想在 C++ Builder 中使用TParallel::For
,但想知道在这个循环中默认使用了多少线程? 例如,如果我有 1000 次可以并行执行的迭代,它们是否会通过一次创建 1000 个线程来执行,或者任何时候的最大线程数受逻辑处理器数量的限制?
我的观点是 - 我不想让TParallel::For
一次创建更多线程然后 CPU 支持。 那么,如果 CPU 支持 8 个线程,这些迭代是 8 个 8 次执行,直到所有 1000 个迭代都执行完毕,还是会同时创建 1000 个线程?
默认池处理程序查找计算机资源和计算机负载。
来自文档(强调我的):
RTL 提供并行编程库 (PPL),使您的应用程序能够利用跨多个 CPU 设备和计算机的工作并行运行任务。 PPL 包括许多高级功能,用于运行任务、加入任务、等待任务组等进行处理。 对于所有这些,有一个线程池可以自动自我调整(基于 CPU 的负载),因此您不必关心为此目的创建或管理线程。
如果你想控制池化,你可以定义你自己的池:
当指定了 TThreadPool 类型的 APool 参数时,程序作者通过使用其 TThreadPool.SetMinWorkerThreads 和 TThreadPool.SetMaxWorkerThreads 方法来控制可用于 TParallel.For 的迭代事件的线程资源。 调用这些方法时请注意,过多的并发线程会产生开销,从而减少或消除并行执行例程的好处。
默认线程池使用以下限制进行初始化:
FMinLimitWorkerThreadCount := TThread.ProcessorCount;
FMaxLimitWorkerThreadCount := TThread.ProcessorCount * MaxThreadsPerCPU;
MaxThreadsPerCPU
是一个设置为 25 的常量。因此,根据处理器负载,池中使用的线程在这些数字之间有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.