我有一个计算密集型程序,可以从简单的并行化中受益,因为任务列表中的每个任务都是相互独立的。
我不是那么熟悉并行计算基础的理论,我似乎无法找到一个明确的答案,我的问题是:
如何以干净,规范的方式在n个线程中分发m个任务?
我对此的解决方案是运行要处理的进程的“块”,即将列表中的前n个任务分配给可用的n个线程,然后(这里我认为在我的假设中是公平的)特定程序所有任务将花费大致相同的时间)在该块完成后,分配下n个任务等等,如果任务数不能被n整除,则取剩余的k <1。 n个任务并在k个线程上执行它们,而其余的n-k个线程空闲。
在C ++中,我确信我可以使用for循环和%运算符轻松完成此操作。我知道这不是最有效的方法,但我认为从“正确”(即确保没有线程空闲)这样做的速度可以忽略不计。
这是正确的方法吗?或者是否可能,如果我有m个任务来分配m个线程到作业并让处理器处理分配任务?
答案 0 :(得分:1)
在手动推出之前,看看您的问题是否可以利用<algorithm>
中的设施:
http://en.cppreference.com/w/cpp/algorithm
这样,您可以利用执行策略,在实现定义的同时,尝试在CPU饥饿和空闲之间找到理想的最佳点,而不会因线程相关的机制或上下文切换而产生不必要的浪费。至少,它会产生尽可能多的线程,可以物理映射到平台,而在更高级的情况下,它会在搜索最佳位置时自行调整。