当使用超线程时,增加的CPU时间(如time
CLI命令所报告的)是否表明效率低下(例如,在自旋锁或缓存丢失中花费的时间),或者CPU时间是否可能因HT的奇怪性质而膨胀?(例如,真正的内核很忙,HT不能启动)
我有四核i7,我正在测试一个OpenMP程序的平凡并行部分(图像到调色板的重新映射)-没有锁,没有临界区。所有线程都访问一些只读共享内存(查找表),但只对自己的内存进行写操作。
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
我担心CPU使用时间的数量随着内核数量超过1或2而迅速增加。
我想在理想的情况下,CPU时间不会增加太多(相同的工作量只是分布在多个内核上)。
这是否意味着有40%的开销花费在并行程序上?
这很可能是如何测量CPU时间的人工产物。举一个简单的例子,如果您运行一个100 MHz的CPU和一个3 GHz的CPU各1秒钟,每个CPU都会报告它运行了1秒钟。第二个CPU可能会多做30倍的工作,但只需要1秒钟。
对于超线程,一个合理的(不太准确的)模型是一个核心可以运行一个任务,比如2000mhz,或者两个任务,比如1200mhz。运行两个任务时,每个线程只完成60%的工作,但是两个线程加在一起完成120%的工作,提高了20%。但是如果操作系统询问使用了多少秒的CPU时间,第一个将在实时中每隔一秒报告"1秒",而第二个将报告"2秒"。
所以报告的CPU时间增加了。如果小于两倍,则整体性能得到改善。
快速问题—您正在运行的是实时程序/usr/bin/time,还是内置的同名bash命令?我不确定这有什么关系,他们看起来很像。
看着你的数字表,我感觉到处理的数据集(即输入加上所有输出数据)总体上相当大(大于L2缓存),并且每个数据项的处理并不那么长。
数字显示从1到2核几乎是线性的改进,但是当你使用4核时,这一点明显减弱。超线程内核实际上没有添加任何东西。这意味着共享的东西正在被争夺。你的程序有自由运行的线程,所以这个东西只能是内存(i7上的L3缓存和主内存)。
这听起来像是I/O绑定而不是计算绑定的典型示例,在这种情况下I/O是往返L3缓存和主存的。二级缓存是256k,所以我猜输入数据加上一组结果和所有中间数组的大小大于256k。
我接近目标了吗?
一般来说,当考虑使用多少线程时,必须考虑共享缓存和内存速度以及数据集大小。这可能是一个正确的错误,因为你必须在运行时解决它,这是大量的编程工作(除非你的硬件配置是固定的)。