如何统计TBB处理指令?

How to count TBB processing instructions?

英特尔 TBB 建议用户将粒度调整为大约 10,000 到 100,000 条处理指令,以获得最高效的并行性。但是,对于什么算作处理指令,没有指南。我计算求和、均衡、乘法、比较等吗?如果我这样做,这些操作的权重是多少?是否有任何分析工具可以按照 TBB 的方式对处理指令进行计数?

给出一个计算工作的合理执行时间是多少的想法是一个非常粗略的建议。这个想法是计算任务不应该太小,太大的任务没有好处。通常,如果您使用带有默认分区程序 (auto_partitioner) 的并行算法,则无需担心这些规则。

在某些情况下(例如,当您需要使用 simple_partitioner 时),您可以测量算法的串行时间并将其乘以您的 CPU 的频率。这个值可以让您了解整个问题的数量 "instruction"/"clock ticks"。所以你可以把问题分成推荐大小的块。

至于工具,我想有很多分析工具可以计算您的应用程序在特定平台上的执行时间(或 CPU 指令)。 (参见 List of performance analysis tools)。此外,您可以试用 Intel VTune Amplifier,它可以估计 Intel TBB 引入的开销(该工具对基于 TBB 的应用程序有特殊支持),以了解应用程序是否有效地使用了 TBB。

凯文。正如亚历克斯所说,该指南是近似的,并且还涉及其他问题。例如,如果计算的一部分在锁下访问数据,那么这可能会占用您的时间。如果每个任务的计算工作存在不平衡,那么调整单元大小就不那么重要了。

我没有找到讨论确定分区大小的 TBB 文档,但是有一组幻灯片 here 讨论了 "bathtub graph"(幻灯片 7。)它演示了以下观点没有必要为每项任务获得确切的工作量;会有一个很好的范围。

TBB 调度程序还会尝试通过从其他 CPU 窃取任务分区来平衡所有处理器之间的工作,因此一个不平衡的工作负载不会使您完全丧失能力。