英特尔® Parallel Amplifier 入门 - 程序在哪里等待?

此步骤中,您将运行锁定和等待分析,了解 algorithm_3 中出现标记为 OK 的串行 CPU 时间的原因。


分析锁定和等待

要运行锁定和等待分析,从 Amplifier 的工具栏中选择 Locks and Waits - Where is my application waiting? 并单击 Profile

Locks and Waits:Bottom-up 窗口提供了以下数据



请注意,等待时间最长的同步对象是一个线程。双击该线程进入造成等待的源代码。



可以看到,主线程在等待矩阵变换线程完成。这并不是问题,因为矩阵变换线程正在进行计算,而主线程在等待其完成。

Locks and Waits:Bottom-up 窗口中的第二项会更有趣。这是一个临界区(Critical Section),仅在临界区导致等待时才会出现串行化。双击临界区查看存在等待问题的源代码。



该临界区是在 algorithm_3 的线程化过程中创建的。它导致了较长的等待时间。如果更细致地检查代码,即可发现临界区不是必要的。data.cc[i] = 0.0;由在上面的for循环中i的设定方式,可以保证 该语句中所用的 i 索引已经得到保护,可免受多线程访问的影响。for 循环的循环 i 被 语句i+=NumThreads设置,其已基于各线程设置了相应的值。因此,可删除临界区的使用并重新运行应用程序。


重新生成最终应用程序

回到 Visual Studio* 软件,注释掉 EnterCriticalSection 调用(第 216 行)和 LeaveCriticalSection 调用(第 218 行),重新编译应用程序。


运行最终基准测试

在命令行窗口内运行生成的 matrix.exe。



应用程序的执行时间从 14.01 秒缩短至 13.83 秒。

For more complete information about compiler optimizations, see our Optimization Notice.