ZHCUAQ1F july 2015 – april 2023
有效利用程序指令缓存是从 C6000 获得最佳性能的重要因素。专用程序指令缓存 (L1P) 提供了快速指令获功能,但缓存缺失的代价可能非常高。某些应用程序(例如 h264)会因为L1P缓存缺失而花费30% 以上的处理器时间。当未能从 L1P 读取指令,并且进程需要从下一级内存访问指令时,就会发生缓存缺失。对L2 或外部存储器的请求比从 L1P 访问的延迟更长。
谨慎放置代码段可以大幅减少缓存缺失的次数。C6000 L1P 对代码放置特别敏感,因为它是直接映射 的。
许多 L1P 缓存缺失都是冲突缺失。当缓存最近逐出了某个代码块但随后又再次需要该代码块时,就会发生冲突缺失。在程序指令缓存中,当两个经常执行的代码块(通常来自不同的函数)交错执行并映射到相同的缓存行时,通常会发生这种情况。
例如,假设在函数 A 的循环内部调用了函数 B,再假设函数 A 的循环代码被映射到与每次调用 B 时都会执行的函数 B 的代码块相同的缓存行中。每次从该循环中调用函数 B 时,函数 A 中的循环代码都会被映射到同一缓存行的函数 B 中的代码从缓存中逐出。更糟糕的是,当 B 返回到 A 时,A 中的循环代码将映射到同一缓存行的函数 B 中的代码逐出。
每次循环迭代都会导致两次程序指令缓存冲缺失。如果循环被多次遍历,则因程序指令缓存停顿而丢失的处理器周期数会变得非常大。
通过更智能地放置同时处于活动状态的函数,可以避免许多程序指令缓存缺失。使用代码放置策略可以显著地提高程序指令缓存效率。这些策略利用检测应用程序运行期间收集的动态配置文件信息。
程序缓存布局工具 (clt6x) 以加权调用图的形式获取动态配置文件信息,然后创建可作为链接器输入的首选函数顺序命令文件,以指导函数子段的放置。
可以使用程序缓存布局工具帮助改善程序的局域性,并减少应用程序运行期间发生的 L1P 缓存冲突缺失的次数,从而提高应用程序的性能。