今天讨论一下Parallel Amplifier中并行度分析(Concurrency Analysis)。并行度是衡量一个多线程程序在运行中对多个CPU或核的利用率。在解释几个相关定义前先作一个假设,大家知道一台计算机上除了OS以外总有若干个后台程序在运行,假定这些程序运行时占用CPU的时间很小,不影响被Amplifier分析的程序的正常运行。
1. Available CPU time(可用CPU时间)= Elapsed time * Target Concurrency
- l Elapsed time是被测程序的运行时间
- l Target Concurrency即目标并行度,一般指该计算机中CPU/Core的总数,如2个4核的CPU,Target Concurrency为8.
2. Used CPU time(用到的CPU时间)= sum of (Concurrency(i)* duration(i))
- l 多线程程序运行时激活线程数量不一定是恒定的。有时线程的数量超过CPU/Core的总数,但各个线程分时共享CPU/Core,并行度不会大于CPU/Core的总数,即concurrency(i) = Min(actived thread #, Target Concurrency)
- l Duration(i)表示程序在某一并行度下运行的时间。
- l 例如在一台有2个双核CPU的计算机上,一个程序运行10秒.
| Actived Thread number | 1 | 2 | 3 | 4 | 5 |
| Duration(sec) | 3 | 2 | 2 | 2 | 1 |
| Used CPU time(sec) | 3 | 4 | 6 | 8 | 4 |
在Actived Thread Number等于5,因为总核数为4,所以Concurrency(5)为4,总Used CPU Time为25秒。
3. Unused CPU Time = Available CPU - Used CPU Time
4. Concurrency(并行度)= Used CPU Time/Elapsed Time. 理论上最大为运行该程序的计算机上CPU/Core的总数。
5. CPU/Core utilization = Used CPU Time/Available CPU Time
本例中
Available CPU time = 10 *4 = 40 sec
Used CPU time = 25 sec
Unused CPU time = 40 -25 = 15 sec
Concurrency = 25/10 = 2.5
CPU/Core utilization = 25/40 = 62.5%
2.5的并行度表示相比运行在一个单核/CPU,在该程序运行在4核的计算机上时,最多可节省60%的运行时间。你可能会问该程序运行在8核机器上会怎么样呢?如果代码中限定了actived Thread number最多为5,结论是性能提高非常有限。换个说法这个程序的可扩展性不好。顺便提一下,用OpenMP实现的多线程能动态设定合适的actived Thread number.
