英特尔® 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 秒。

Para obter informações mais completas sobre otimizações do compilador, consulte nosso aviso de otimização.