1
2
医生:在每项任务中做更多的工作。(可能每次从队列中取出多个当前任务,但还有许多其他可能性。) 你的任务(计算上)太小了。一个4x4矩阵乘法只是几个乘法和加法。约60-70次行动。其中20个一起完成并不贵多少,~1500(流水线)算术运算。线程切换的成本(包括唤醒等待cv的线程,然后唤醒实际上下文切换)可能高于此(可能) 许多的 较高的。 此外,同步(互斥操作和cv)的成本非常昂贵,尤其是在争用的情况下,尤其是在硬件本机同步操作比算术(由于多核之间的缓存一致性强制)昂贵得多的多核系统上。 这就是为什么你观察到,当每项任务都进行100次矩阵运算时,问题会减少,从20次增加到了20次:工人们回到井里,为了更多的事情做得太频繁,导致了争论,当他们只有20个MMS要做的时候……给他们100个任务,使他们的速度减慢到足以减少竞争。 (在注释中,您指出只有一个供应商,几乎消除了作为队列争用源的问题。但是,即使在那里,在cv锁下排队的任务也比排队的任务多,这就更好了——达到了限制工人接受任务的极限。) |
2
1
我建议使用事件处理程序。 事件有两种类型:
主线程维护一个作业队列,仅由主线程访问(因此没有互斥锁) 当一个作业到达时,它被放置在作业队列中。 当一个工人完成一项工作时,一项工作就会弹出并传递给该工人。 在启动和没有可用作业时,您还需要一个空闲的工作队列。 您还需要一个事件处理程序。这些都是棘手的,所以最好使用经过良好测试的库,而不是滚动您自己的库。我使用boost::asio |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |