在单CPU上使用多线程
假设我们略微修改我们的例子,让它能演示有些时候在单处理器上使用多线程的好处。
在这个修改的例子里面,网络中的一个节点负责计算扫描线(与前面的图像例子一样)。不过,当一个扫描线的计算结束后,它的数据就通过网络发送到另外一个节点。下面是我们修改后的main()函数:
int
main (int argc, char **argv)
{
int x1;
… // perform initializations
for (x1 = 0; x1 < num_x_lines; x1++) {
do_one_line (x1); // "C" in our diagram, below
tx_one_line_wait_ack (x1); // "X" and "W" in diagram below
}
}
你可以看出,我们已经消除了显示部分的代码,并添加了一个tx_one_line_wait_ack()函数。并进一步假设我们用的是较慢的网络,并且CPU并不参与网络传输的工作,它只是把数据发送到硬件,之后这个硬件来完成数据的传输。tx_one_line_wait_ack()函数使用了一点CPU来把数据发送到硬件,之后在等待远端的接收信号的时候是不使用CPU的。
下面的是CPU的使用框图(C表示了图像计算部分,X表示传输部分,W表示等待接收确认部分):
我们可以看到在等待硬件完成它们的工作的时候,浪费了大量宝贵的CPU时间。如果使用多线程的话,我们就可以更好的利用CPU了,如下图所示:
在这幅图里面,我们可以看到情况就好些了。虽然在第二个线程里面仍然会花费一些时间等待,不过总体来说我们消减了总的计算时间。
如果我们的时间中,Tcompute 用于计算,Ttx 用于传输,Twait 用于硬件传输,在第一个情况下,我们总的运行时间是:
(Tcompute + Ttx + Twait) × num_x_lines
而在第二个情况下,总的运行时间是:
(Tcompute + Ttx) × num_x_lines + Twait
中间减少的时间为:
Twait × (num_x_lines – 1)
显然,Twait ≤ Tcompute。
如果我们在有4个CPU的SMP系统上运行4线程的版本,那么运行情况就像下面这样:
可以看到,每个CPU都没有被充分利用(在utilization图中的空格表示)。在上面的图中有两个有趣的地方。当这4个线程开始时,它们都开始计算。不幸的是当这些线程完成计算之后,它们就开始对传输硬件的竞争。(在图中的X部分有偏移,这是因为同一时刻只能有一个正在进行的传输)。这在一开始就有一些异常。一旦线程过了这个阶段,它们就自然的与传输硬件同步了,因为传输所花的时间只是计算周期的四分之一。忽略一开始的异常,这个系统就可以使用如下公式描述了:
(Tcompute + Ttx + Twait) × num_x_lines / num_cpus
这个公式说明了,在4个CPU上面使用4个线程要比我们一开始的单线程模式快4倍。
通过结合后面的单CPU上面使用多线程的方法,我们可以让线程数大于CPU的数目,这样多出的线程就能够使用因为传输等待而产生的空闲时间了。这样的运行情况就会像下面这样:
在这里,有如下几个假设:
- 线程5、6、7、8分别绑定到1、2、3、4号处理器;
- 传输部分的优先级比计算部分的优先级高;
- 传输为不可中断的操作。
在上面的示意图中,可以发现即使我们有了两倍于CPU数量的线程,在运行的过程中有时还是有CPU未完全使用的情况。在图中有三个地方,CPU是低效使用的,这在每个CPU的使用带状图中使用数字进行了标注:
- 1. 线程1在等待接收确认(W状态),同时线程5完成了计算并等待传输;
2. 线程2与6都在等待确认;
3. 线程3在等待确认的时候线程7完成了计算并等待传输。
这个例子同时也可以得出一个结论,就是你不能通过不停的添加CPU来让程序运行的更快些,因为还有其他的受限因素。有些时候,这个受限因素是多处理器的主板的设计——当多个CPU试图访问同一区域的内存时会产生多少的内存与设备的竞争。在我们的例子里面,我们可以看到TX Slot Utilization条形图开始变满了。如果我们添加足够多的CPU,在运行的时候必然会出问题,因为它们的线程要等待传输,而是低速运行的。
不论如何,都是可以使用大量的线程来利用空闲的CPU的,这样可以更好的利用CPU。利用的公式大概像下面这样:
(Tcompute + Ttx) × num_x_lines / num_cpus
这个计算的本质就是我们只是受限于我们使用的CPU的个数;我们不让任何CPU因为等待响应而空闲。(当然了,这是理想化的。在上面的框图中,有几次是周期性的让一个CPU空闲的,
Tcompute + Ttx × num_x_lines是我们速度的限制)
Related posts:
近期评论