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.

[参考译文] TMS320C6678:具有 OpenMP 运行时的高速缓存/预取的 MAR 配置

Guru**** 2551110 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/590641/tms320c6678-mar-configuration-for-cache-prefetch-with-openmp-runtime

器件型号:TMS320C6678
Thread 中讨论的其他器件:SYSBIOS

您好!

我对 MAR 配置有疑问。 我在 C6678 EVM 上`m OpenMP 运行时(由 ProcSDK 版本03.03.00提供)。 它工作正常、但我需要确认 MAR 配置。
默认情况下、MAR12配置为0x0000000D。 当我使用 OpenMP 运行时,MAR12在到达 main()函数之前被配置为0x0000000B。  

关于 MAR 配置。 请看一下  

4.4.5存储器属性寄存器(MARN)定义

它表示 MAR 的位1和位2是保留的。 如果看到配置为0x0000000B、则表示 OpenMP 运行时设置 MAR12位0以启用缓存、设置 bit1以用于某些未知用途、设置 bit3以启用预取。
为什么即使保留了 MAR12位1,OpenMP 也会设置它。
此外、我注意到我们不应将 MAR12配置为可编程。 请看一下  

咨询28读取异常和数据损坏问题

`m、现在我想知道我们是否应该将 MAR12配置为0x00000003而不是0x0000000B。 您对此有什么意见吗? 供参考,我尝试在 main()开头覆盖 MAR12配置(如下所示),发现它仍然适用于我的 OpenMP 应用。

marVal = cache_getMar ((ptr) 0x0c020000);
marVal &=~(1 <<3);
cache_wbInvAll ();
cache_setMar ((ptr) 0x0c020000、0x003e0000、marVal); 

此致、
Naoki

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

    我已将此内容转发给 OpenMP 专家。 他们的反馈应发布在此处。

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

    感谢您的回答,但您对此是否有任何更新?

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

    Naoki、

    启用 OpenMP 预取是一种优化。 因此、可以通过将 MAR 寄存器设置为0x3来禁用预取。

    将 MAR 寄存器的位1设置为1可启用该区域的直写缓存模式。 必须启用直写操作以确保 OpenMP 运行时的正确性。 运行时使用直写模式来确保内核之间不存在共享数据的错误共享。  

    Ajay

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

    Ajay、

    很抱歉我的回答延迟。 好的、MAR 的第2位是什么意思?
    CorePac 用户指南未提及 MAR 寄存器上的 bit2/3。 它们被视为保留。 您能澄清一下吗?


    此外、SYS/BIOS 缓存模块为其启动配置生成 MAR 值。 n`t 我们在*。cfg 文件中故意覆盖它们、则在到达 app main()函数之前、将以下 MAR 值设置为 MAR 寄存器。

    请查找 您的 C:\ti\BIOS_6_46_04_53\packages/ti\SysBIOS\family\c66\Cache

    对于(var i=0;i < cache.marvalues.length;i++){
    如果(i = 0){
    /*启用'PC'位*/
    cache.marvalues[i]= 0x1;
    }
    否则、如果(I > 0 && I <= 11){
    /*禁用所有位*/
    cache.marvalues[i]= 0x0;
    }
    否则、如果(I > 11 && I <= 15){
    /*启用'PC'、'PCX'和'PFX'*/
    cache.marvalues[i]= 0xD;
    }
    否则{
    /*启用'PCX'和'PFX'*/
    cache.marvalues[i]= 0xC;
    }
    }
    
    

    上述值(cache_marvalues)在 cache_startup ()中设置为 Mars。 另请查看 C:\ti\BIOS_6_46_04_53\packages/ti\SysBIOS\family\c66\Cache。

    /*
    === cache_startup ===
    *设置默认缓存大小和 MAR 寄存器值。
    //
    空 cache_startup ()
    {
    uint32 i;
    cache_size 高速缓存大小;
    
    cache_getL1DInitSize (&CacheSize);
    cache_getL1InitSize (&CacheSize);
    cache_getL2InitSize (&CacheSize);
    cache_setSize (&CacheSize);
    
    /*
    * MAR0-15只准备就绪、将生成异常
    *启用内存保护时。 从 MAR16开始。
    *
    对于(I = 16;I < 256;I++){
    cache_setMar ((ptr)(i << 24)、1、cache_marvalues[i]);
    }
    } 

    总之、默认情况下、BIOS 仅为 DDR3区域(DDR3为 MAR16~)设置 MAR 值、并有意设置 MAR 寄存器中的 PCX (位2)和 PFX (位3)位。

    如果用户想要为 DDR3启用缓存/预取、他们可以在其应用中将0x9覆盖到 MARS、但此时、他们可以强制 PCX 位为0、因为用户指南没有详细介绍该位。 在这种情况下,超速缓存/预取是否仍然可以正确地用于 DDR3?

    此致、
    Naoki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很`m 您的忙、但我真的在等您的回复。
    提前感谢您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MAR 寄存器位:
    位0:PC
    位1:WTE
    位2:PCX
    位3:pfx

    PCX 位指示给定的地址范围是否可在外部高速缓存中高速缓存
    例如 MSMC
    PFX 位指示给定的地址范围是否可由外部预取引擎预取。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Ajay Jayaraj"]
    PCX 位指示给定的地址范围是否可在外部高速缓存中高速缓存
    例如 MSMC[/引用]

    C667x 不支持 MSMC 上的缓存。 因此、我认为用户可以将该位设置为0 (禁用)。 正确,对吧?
    `ll 说明后、我将关闭该线程。

    此致、
    Naoki

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

    MSMC 始终是可连接的。 请参阅 C66x corepac 4.4.5:要支持 MSMC、L2存储器控制器会强制使用对应的 MAR.PC 位
    MSMC 存储器为1 (始终为 MAR12.PC 至 MAR15.PC)。 这使得
    当通过其主地址访问时、MSMC 存储器始终可在 L1D 中高速缓存
    范围。 由于使用 XMC 的 MPAX 配置了别名,因此可能存在次要范围
    单位-这些范围由其对应的 MAR.PC 位管理。

    如果要使 MSMC 不可缓存、则需要使用 MPAX 将其映射到其他位置、然后设置 MAR 寄存器。

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

    Eric、

    我知道这个。

    我n`t 的是 PCX 位的用法。 Ajay 说:"PCX 位指示给定的地址范围是否可在 MSMC 等外部高速缓存中高速缓存"。 由于 MSMC 不支持在 MSMC 中配置高速缓存、我的意思是、MSMC 看起来不像 L2SRAM/高速缓存、并且仅用作 SRAM。 我猜 PCX 位被保留用于将来的增强、即 MSMC 中的外部高速缓存。
    这`s 我想知道 PCX 位是否可以被视为"无关`t CARR"、并且当前 C66x 用户可以接受0或1的值(当前 KeyStone I 系列的高速缓存行为在 PCX=0和 PCX=1之间没有区别)。 我`m 等待您的回答。

    此致、
    Naoki



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

    请参阅 e2e.ti.com/.../333040。PCx = 0或1无关紧要。

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

    好的。 感谢您的澄清。 我关闭线程。

    此致、
    Naoki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但是,当 MAR 设置为0x3时,缓存会发生变化,因此它们不能以4向方式工作。 就像单向缓存一样。 当一个进程访问 DDR 的两个块时、例如0x81000000和0x82000000、将 MAR 设置为3慢于1。
    为什么?