This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VH-Q1:高速缓存处理(L2、L3_MSMC)-集成我们的软件栈

Guru**** 2470720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1464357/tda4vh-q1-cache-handling-l2-l3_msmc---integration-of-our-software-stack

器件型号:TDA4VH-Q1

工具与软件:

您好!

您能否提供有关 ARM Cortex-A72计算集群上 L2和 L3高速缓存处理的更多详细信息?

我们的当前设置为:

电路板:J784s4定制电路板
PDK 09.02.00.30
Linux
SPL 引导

MSMC:6MB 的存储器在 uboot 上配置为 L3高速缓存(board-cfg.yaml)

    # msmc_cache_size calculation:
    # If the whole memory is X MB the value you write to this field is n.
    # The value of n sets the cache size as n * X/64. The value of n should
    # be given in steps of 4, which makes the size of cache to be
    # configured in steps on X/8 MB.
    # Simplified: n = Cache_in_MB * 8
    
    msmc:
        subhdr:
            magic: 0xA5C3
            size: 5
        # enable 6MB msmc cache
        msmc_cache_size : 0x30


相应的内核配置为:

&msmc_l3 {
	cache-size = <0x600000>;  // Set the L3 cache to 6MB
	cache-line-size = <128>;  // Cache line size is 128byte
	cache-sets = <2048>;      // Number of cache sets
};


lscpu 的输出:
lscpu
Architecture:            aarch64
  CPU op-mode(s):        32-bit, 64-bit
  Byte Order:            Little Endian
CPU(s):                  8
  On-line CPU(s) list:   0,1,4,5
  Off-line CPU(s) list:  2,3,6,7
Vendor ID:               ARM
  Model name:            Cortex-A72
    Model:               0
    Thread(s) per core:  1
    Core(s) per cluster: 4
    Socket(s):           -
    Cluster(s):          1
    Stepping:            r1p0
    BogoMIPS:            400.00
    Flags:               fp asimd aes pmull sha1 sha2 crc32 cpuid
Caches (sum of all):
  L1d:                   128 KiB (4 instances)
  L1i:                   192 KiB (4 instances)
  L2:                    4 MiB (2 instances)
  L3:                    6 MiB (1 instance)




当前的软件情况是:
在第一个 A72集群(集群0)上、我们有一个 dotnet 运行时、它在上托管几个 C#应用程序
其他群集(群集1)正在运行一个 c++实时应用程序。

我们的问题是:
dotnet 运行时为其运行的每个 CPU 内核(群集0)生成一个垃圾收集(GC)线程。
当 GC 线程偶尔工作时,我们会遇到实时线程的干扰
在第二个 A72集群(集群1)上运行的应用、使 CPU 时间几乎翻倍。
在某些情况下、这会导致应用中出现错误情况、从而导致 RT 期限未满。

我们的理论为:
dotnet 启动的垃圾收集工作会导致大量内存事务、从而导致(a)高速缓存
无效化的,特别是 两个 A72集群之间共享 L3高速缓存、或(b) DDR 存储器控制器总线饱和或(c)这两种现象。


我们有一些问题可以验证我们的理论:

1.我们如何通过测量高速缓存缺失、总线饱和等方面的专用性能计数器来检验我们的假设?
2.是否可以将 L3高速缓存分开/分区并将其分别分配给两个 A72群集?
3.是否有增加 DDR 内存总线吞吐量的方法(当它被证明是瓶颈时)?
4.我们没有想到的其他原因?

此致
Thomas Willetal

 




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    假设的一个确认:如果您已经禁用 GC 线程并确保 RT 截止日期得到满足?

    [quote userid="573262" url="~/support/processors-group/processors/f/processors-forum/1464357/tda4vh-q1-cache-handling-l2-l3_msmc---integration-of-our-software-stack 具有将三级高速缓存分开/分区并将它们分别分配给两个 A72群集的可能性吗?

    这是不可能的。 这是两种情况。 我们没有按内核自定义它的配置。

    此致、

    基尔西  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Keerthy、您好!

    谢谢、是的、我们已经使用 GC 线程进行了检查。 我们只在 GC 线程处于活动状态时观察到更长的 CPU 执行时间。

    此致、
    Thomas


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我已经加入了我们的专家。 我们将就此问题与您联系。  

    谢谢!  

    基尔西  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您观察到的执行抖动幅度是多少(5uS、5ms、50mS、...)?  通常一阶效应来自 SW 及其调度。  共享结构(相干 L1/L2缓存、共享 L3、共享 DDR)可能会产生二阶效应(具体取决于您的需求)。   对于更严苛的 RT 需求、MSMC-SRAM 将是最佳选择。

    您是否在群集中运行 SMP Linux、但使用关联来固定 RT 任务?  或者您是否正在运行 AMP 实例?  可以通过将 AMP 集群 MMU 标记为"非共享"来实现一些可解析性。  这将减少可能与一致性监控相关的延迟。

    如果您的应用在 TI J784S4 EVM 上运行、我会发现使用外部硬件跟踪 MIPI-60进入 Lauterbach 接收器会非常好。  系统和处理器跟踪(以及 PMU 导出)都提供了大量的 HLOS、RTOS 和硬件执行时序信息。

    如果您的集群可以进行交叉通信、也许您可以在非 RT 线程安全(或不安全)执行 GC 操作时向其发出信号。  这种协调程度可能有助于避免这一问题。

    此致、
    理查德·W·
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Richard:

    感谢您的回答。 我们观察到5ms 抖动、它会影响我们在内核跟踪日志中看到正在执行的所有(SW)线程。 (在 kernelshark 中显示)。
    我们的系统是在两个 A72集群上运行的 SMP Linux 系统、其他固件组件会在 r5f 内核上运行、并以拆分模式运行。

    可用的8MB MSMC 内存被安装到6MB L3高速缓存中、剩余的2MB 被我们的 r5f 固件使用。
    此不同的 RF5应用部分使用此存储器作为快速文本段。 它还用作 A72 Linux 应用程序和 r5f 固件之间数据交换的共享存储器。

    在另外一个论坛线程中、我们遇到了 r5f 上的代码执行停顿的问题。
    TDA4VH-Q1:R5F 执行展位-处理器论坛-处理器- TI E2E 支持论坛

    通过在 r5f 端采用 MPU 表并使用某些系统性能功能(例如 MSMC QoS、DRAM CoS)、可以改善行为。
    https://www.ti.com/lit/an/spraci6/spraci6.pdf 是我们找到的文档

    我们的定制硬件没有任何 MIPI-60 JTAG 连接器、但我们的连接器是带 EMU0/1的 TI-14。 我们已将其用于 r5f Lauterbach 迹线。


    问题:
    1.在 A72上也会发生类似的情况吗?
       我们的 RT 应用程序可能与 R5f 类似、尤其是在.NET GC 线程正在运行时。 这使所有高速缓存无效、因此需要从 LPDDR4重新加载数据、因此 RT 应用会使数据不匹配。
    2.我们还发现了类似 MSMC Way 组分区的东西。 此设置是否也会影响 MSMC L3高速缓存?
    3. j784s4 soc 提供大量的实时优化设置、MSMC QoS、DRAM cos、MSMC Way 组分区。
        是否有适用于实时应用的一些最佳实践值的示例?
    4.是否有任何寄存器(如某些性能计数器)可用于测量此优化参数的修改?
    5.要得出有关高速缓存和 DDR 状态的结论、必须监视/跟踪哪些计数器(在 Trace32外围设备视图中)?

    此致
    Thomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Thomas:

    5ms 似乎处于错误的范围内、对于单个硬件缓冲区来说是一个很大的问题、尽管根据 RT 例程的总执行时间量可能会合并许多硬件事件。 我想 SW 是一阶贡献者、但肯定 HW 将发挥作用。

    您是否可以简化系统并缩小系统规模、以便在一个群集上运行所有操作?  如果您在4个内核与8个内核之间看到抖动、这将是更容易处理的问题。  任何其他简化步骤都可能会有所帮助。  或许将 RT 内核减少为简单的标志设置(不起作用)、并查看 GC 是否仍以相同的幅度中断。

    检查1个集群后、如果您发现它是交叉集群问题、那么应用的一些交叉集群通信可能取决于底层 SEV/WFES、那么我在另一个 E2E 中建议的更改可能会对您的系统有所帮助。  当前的 SW/FW 映像无法通过 CLEC 正确链接集群。  这导致 SEV 只能在群集内工作、而不能在群集上工作。  您的代码可能需要等待其他事件唤醒、但唤醒时间较长。   在本视频中、我将展示如何使用 TRACE32解决此问题。  这将是一个快速运行时测试。  最终、这将是处理 JIRA 后的基本映像的一部分。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1440747/tda4vh-q1-event-communication-between-clusters-is-not-possible/5527113#5527113

    每个群集都可以设置为不同的优先级、从而可以提升指定为 RT 的群集。  群集优先级位于每个 CPU 本地地址空间中。  可以使用调试器完成快速测试。  将核心焦点设置为1-4的核心并设置一个集群优先级、然后将焦点设置为5-8并设置另一个优先级。  设置此参数的最佳位置可能是在启动前在一些 ATF 代码中、但可能其他方式也是可以接受的。  对于 cluster0、优先级为 asd:0x6000020;对于 cluster1、优先级为0x61000020。
    在触摸 QoS 设置时、我发现使用芯片周围存在的 cptracer 探头非常有用。  通过在 EMIF 等端点设置探测器、您可以看到 QoS 设置正在使用事务探测器生效。  使用带宽或延迟探针可能是测量影响的一种好方法。  在示例 cmm 项目中、我在 notes 目录和 cptracer.cmm 文件中有一些注释。  TI 现场代表也可能提供了一些配套的 PPT。  我将附上一个简短的视频、介绍如何验证优先级设置。
    随附的是用于制作视频的脚本。  zip 的密码为"T32"。  对于跟踪器、使用地址或路由 ID (哪个主器件)筛选器有助于对流量进行排序。  脚本 map_active_bus_routes.cmm 将很有用、因为它将在一个位置列出所有的主器件。
    对于跟踪、使用 EMU 引脚时最好使用片外跟踪、但是、如果采样周期设置为高电平或使用滤波、则片内跟踪缓冲器对于统计数据(例如带宽)非常有效。  您的14引脚连接器对于片外布线用处不大、因为它没有足够的布线引脚、也不会自然地路由到外部布线接收器。 使用自定义适配器黑客、您可以获得1位片外跟踪、这可能会产生一些干扰、但不够宽、因此在没有滤波器节流的情况下会出现溢出。  在 mipi60上使用完整布线的 EVM 上进行原型设计可能是最快的实验方法。  
    重新扫描我以前的评论可能是有顺序的。  任何可标记为 MMU 非共享的存储器都将减少硬件开销并减少可能的抖动源。 在具有最终级独立流(来自 C7)的系统中、降低了效率。   默认情况下、SMP Linux 将共享所有内容、但如果有道理、您可以进行分割。  此外、如果将 MSMC-SRAM 改为缓存、则会使某些东西的可预测性比共享 LPDDR 高得多。
    希望上述要点提供了一些实验角度。  E2E 主题针对该主题的扩展性不好。
    此致、
    理查德·W·