用于一组互斥任务的线程级并行性

时间:2014-01-23 15:01:42

标签: c++ multithreading parallel-processing

我在使用C ++处理流数据时遇到了问题。数据来自条目,每个条目的大小相对较小,并且处理每个条目的任务不会花费太多时间。但是每个条目以及该条目的任务处理都被分配给(一个概念,而不是C ++类),其中只有一个属于同一个类的任务可以在一个时间。

此外,还有数十亿条目和数千万个课程,而且课程是随机课程。

我发现很难并行化这些任务。任何关于如何加快这一过程的建议都将是很有帮助的!

非常感谢!

2 个答案:

答案 0 :(得分:0)

将工作条目放入一组特定于类的工作队列中。使用队列大小作为优先级,较大的优先级优先于较小的大小。设置priority queue(队列)以根据类的优先级保存特定于类的工作队列。

如果没有人正在处理该队列,则将工作条目输入到相应的队列中。

设置一个与您拥有的CPU数量大小相同的线程池。

每个线程都会向优先级队列询问最高优先级的工作队列,这个队列可以说是最有效的工作队列。该线程从优先级队列中删除类队列。然后它处理该队列中的所有元素,而不锁定它;这样可以减少每个单元的开销。

如果同时出现该类的新成员,则会将它们添加到该类的新队列中,但不会放在优先级队列中。工作线程使用当前队列,检查同一类的新队列并处理该队列(如果存在)。

答案 1 :(得分:0)

假设CPU至少在某种程度上有所涉及,那么每个硬件处理器需要一个任务处理器。

每个处理器锁定一组活动类,在队列前面啜饮一堆作业,这些作业可以在当前设置状态下运行,在集合中标记为正在使用,解锁集合和队列,以及进程

每个slurp有多少个工作因作业率,处理器数量以及它们的聚集和延迟敏感程度而异。

饥饿应该是不可能的,因为一旦课程可以自由处理,未被篡改的元素应该是高度的。

批量工作以保持设置和队列争用率低:理想情况下,根据争用,空闲和延迟信息动态更改批量大小。

这使得开销保持与处理器数量成比例,而不是任务类数量。