1

增加的 CPU 时间(如timeCLI 命令所报告的)是否表明使用超线程时效率低下(例如花费在自旋锁或缓存未命中的时间),或者 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

我担心当核心数量超过 1 或 2 时,使用的 CPU 时间量会迅速增加。

我想在理想情况下,CPU 时间不会增加太多(相同数量的工作只是分布在多个内核上)。

这是否意味着有 40% 的开销用于并行化程序?

4

2 回答 2

1

快速提问——你运行的是真正的时间程序 /usr/bin/time,还是内置的同名 bash 命令?我不确定这是否重要,它们看起来非常相似。

查看您的数字表,我感觉处理后的数据集(即输入加上所有输出数据)总体上相当大(大于 L2 缓存),并且每个数据项的处理时间并不长。

数字显示从 1 核到 2 核的改进几乎是线性的,但是当您使用 4 核时,这种改进显着下降。hyoerthreaded 内核几乎没有添加任何内容。这意味着正在争夺共享的东西。您的程序有自由运行的线程,因此只能是内存(i7 上的 L3 缓存和主内存)。

这听起来像是受 I/O 限制而不是计算限制的典型示例,在这种情况下,I/O 是往返于 L3 缓存和主内存。L2 缓存是 256k,所以我猜你的输入数据加上一组结果和所有中间数组的大小都大于 256k。

我接近标记了吗?

一般来说,在考虑使用多少线程时,您必须考虑共享缓存和内存速度以及数据集大小。这可能是一个正确的错误,因为您必须在运行时解决它,这需要大量的编程工作(除非您的硬件配置是固定的)。

于 2013-03-14T06:52:03.107 回答
1

这很可能是如何测量 CPU 时间的人工制品。一个简单的例子,如果你运行一个 100 MHz CPU 和一个 3 GHz CPU 各一秒钟,每个都将报告它运行了一秒钟。第二个 CPU 可能会多做 30 倍的工作,但需要一秒钟。

使用超线程,一个合理(不太准确)的模型是一个内核可以运行一个任务,比如说 2000 MHz,或者两个任务,比如说 1200 MHz。运行两个任务,每个线程只完成 60% 的工作,但两个线程一起完成 120% 的工作,提高了 20%。但是如果操作系统询问使用了多少秒的 CPU 时间,第一个将实时报告每秒后的“1 秒”,而第二个将报告“2 秒”。

所以报告的 CPU 时间会增加。如果它不到一倍,则整体性能会有所提高。

于 2014-06-08T23:52:37.413 回答