增加的CPU时间(由time
CLI命令报告)指示使用超线程时的低效率(例如,在自旋锁或高速缓存未命中中花费的时间)或者CPU时间是否可能被奇怪的性质夸大HT? (例如,真核正忙,HT无法启动)
我有四核i7,我正在测试OpenMP program的平凡可并行化部分(图像到调色板重映射) - 没有锁,没有关键部分。所有线程都访问一些只读共享内存(查找表),但只能写入自己的内存。
cores real CPU
1: 5.8 5.8
2: 3.7 5.9
3: 3.1 6.1
4: 2.9 6.8
5: 2.8 7.6
6: 2.7 8.2
7: 2.6 9.0
8: 2.5 9.7
我担心随着核心数超过1或2,使用的CPU时间会迅速增加。
我认为在理想情况下,CPU时间不会增加太多(相同数量的工作只会分布在多个内核上)。
这是否意味着在并行化程序上花费了40%的开销?
答案 0 :(得分:1)
快速提问 - 您是在运行正版时间程序/ usr / bin / time,还是同名的内置bash命令?我不确定是否重要,它们看起来非常相似。
查看您的数字表我感觉到处理后的数据集(即输入加上所有输出数据)总体上相当大(大于L2缓存),并且每个数据项的处理不是那么冗长。
这些数字显示从1核心到2核心几乎呈线性增长,但是当你使用4核心时,这会显着减少。 hyoethreaded核心几乎没有增加任何东西。这意味着共享的东西正在争夺中。你的程序有自由运行的线程,所以东西只能是内存(i7上的L3缓存和主内存)。
这听起来像是I / O绑定而不是计算绑定的典型示例,在这种情况下,I / O是来自L3缓存和主内存。 L2缓存是256k,所以我猜测输入数据的大小加上一组结果和所有中间数组都大于256k。
我是否接近标记?
一般来说,在考虑使用多少线程时,您必须考虑共享缓存和内存速度以及数据集大小。这可能是一个正确的错误,因为你必须在运行时解决这个问题,这需要大量的编程工作(除非你的硬件配置是固定的)。
答案 1 :(得分:1)
很可能是CPU时间测量的假象。一个简单的例子,如果你运行一个100 MHz CPU和一个3 GHz CPU,每个都会报告它运行一秒钟。第二个CPU的工作量可能会增加30倍,但需要一秒钟。
对于超线程,一个合理的(不太准确)模型是一个核心可以运行一个任务,比如2000 MHz,或两个任务,比如1200 MHz。运行两个任务它只能完成每个线程60%的工作,但是两个线程的工作总量的120%,提高了20%。但是如果操作系统询问使用了多少秒CPU时间,那么第一个将报告" 1秒"每秒后实时,而第二个将报告" 2秒"。
因此报告的CPU时间会增加。如果小于双倍,则整体性能得到改善。