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 运行时启用 MSMC 存储器的预取... 是否应禁用?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/757237/tms320c6678-enabling-prefetch-for-msmc-memory-in-openmp-runtime-should-be-disabled

器件型号:TMS320C6678

您好!  

我`ve C667x OpenMP 运行时、注意到运行时为配置为高速缓存的 MSMC 存储器启用了预取功能。

C:\ti\openmp_dsp_c667x_2_06_02_01_debug\packages/ti\runtime\ompbios\OpenMP

void __TI_omp_reset_rtsc_mode (void)
{
//使用通过 ti_sysbios_family_C66_cache_Module_startup 配置的高速缓存
// Platform.XDC 中指定的大小
//__TI_omp_configure_caches();

/* OMP 运行时要求不高速缓存 MSMCSRAM 的一部分。 因为它是这样
*无法禁用 MSMCSRAM 地址范围中的缓存,我们需要
* 2步流程:
* 1. 将 MSMCSRAM 的一部分映射到可以标记为的范围中
*非缓存。 这是通过 MPAX 寄存器来完成的
* 2. 使用相应的将映射段注释为非缓存段
该存储器范围的* MAR 寄存器
*不会通过映射地址范围对 MSMCSRAM 进行所有访问
*被缓存。
*
if (OpenMP*) hasMsmc)
{
_TI_setMPAX (OpenMP*) mpaxForMsmcMapping、
OpenMP* msmcNoCacheVirtualBase、
OpenMP* msmcNoCachePhysicalBase,0x10 // 128 KB */);
_TI_omp_disable_caching (OpenMP*是一个高速缓存)
OpenMP* msmcNoCacheVirtualSize);

/*为 MSMCSRAM 启用缓存*/
__TI_omp_enable_caching (OpenMP* msmcBase, OpenMP* msmcSize);
}
其他
{
__TI_omp_disable_caching (OpenMP* ddrNoCacheBase, OpenMP* ddrNoCacheSize);
}

/*为 DDR 启用缓存*/
__TI_omp_enable_caching (OpenMP* ddrBase、OpenMP* ddrSize);
} 

和 C:\ti\openmp_dsp_c667x_2_06_02_01_debug\packages/ti\runtimes\openmp\src\omp_init.c 中的_TI_omp_enable_caching 函数如下所示:

void __TI_omp_enable_cache (unsigned int start、unsigned int length)
{tomp_setMAR
(start、length、cache_pc|cache_pfx|cache_wte);
}

由于勘误表建议28、我觉得 MSMC 存储器的预取应该被禁用。 对于变通办法、它如下所示:

对于对应于可缓存数据的地址范围0x0C000000–0x0FFFFFFF、软件必须禁用 MARS 中的 PFX 位(只能在监控模式下将 MARS 写入。 MARS 12-15定义0x0C000000–0x0FFFFFFF 属性的 PFX 位默认设置为1)。 这将禁用对这些地址的访问的预取、同时仍允许在 L1D 中缓存这些访问。 如果需要为 MSMC SRAM 和其他存储器空间进行预取、只要它们被重新映射到 MPAX 寄存器内的0x0C00 0000–0x0FFF FFFF 以外的空间、就仍然可以进行预取 (重新映射的 MSMC 将用作共享3级存储器、并可在 L1D 和 L2中进行高速缓存)。 L2高速缓存必须保持开启状态并设置为大于零的高速缓存大小、并且在访问可预取数据时不得冻结、否则 XMC 将对数据预取器应用之前描述的特定于 L1D 的行为、并使系统面临相同的问题。

`ve,我建议实际使用 OpenMP 运行时的客户使用以下自定义来重新构建它:

1.添加以下函数:

void __TI_omp_enable_caching_withoutPFX (无符号 int start、无符号 int length)
{
tomp_setMAR (start、length、cache_pc|cache_wTE);
} 

2.并将现有代码替换为:

void __TI_omp_reset_rtsc_mode (void)
{
//使用通过 ti_sysbios_family_C66_cache_Module_startup 配置的高速缓存
// Platform.XDC 中指定的大小
//__TI_omp_configure_caches();

/* OMP 运行时要求不高速缓存 MSMCSRAM 的一部分。 因为它是这样
*无法禁用 MSMCSRAM 地址范围中的缓存,我们需要
* 2步流程:
* 1. 将 MSMCSRAM 的一部分映射到可以标记为的范围中
*非缓存。 这是通过 MPAX 寄存器来完成的
* 2. 使用相应的将映射段注释为非缓存段
该存储器范围的* MAR 寄存器
*不会通过映射地址范围对 MSMCSRAM 进行所有访问
*被缓存。
*
if (OpenMP*) hasMsmc)
{
_TI_setMPAX (OpenMP*) mpaxForMsmcMapping、
OpenMP* msmcNoCacheVirtualBase、
OpenMP* msmcNoCachePhysicalBase,0x10 // 128 KB */);
_TI_omp_disable_caching (OpenMP*是一个高速缓存)
OpenMP* msmcNoCacheVirtualSize);

/*为 MSMCSRAM 启用缓存*//
_TI_omp_enable_caching (OpenMP* msmcBase、OpenMP* msmcSize);
__TI_omp_enable_caching_withoutPFX (OpenMP* msmcBase, OpenMP* msmcSize);
}
其他
{
__TI_omp_disable_caching (OpenMP* ddrNoCacheBase, OpenMP* ddrNoCacheSize);
}

/*为 DDR 启用缓存*/
__TI_omp_enable_caching (OpenMP* ddrBase、OpenMP* ddrSize);
} 

您是否同意此定制? 如果是,请考虑在将来的发行版中更新 OpenMP 运行时。

请注意、
NK

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

    这是一个有趣的问题。 我们将查看该代码、然后返回给您。

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

    Naoki、

    来自 C6678数据表、

    2.3.1 MSMC SRAM

    MSMC SRAM 可用作共享的2级或3级存储器:

    •共享2级存储器—MSMC 存储器可由 L1D 和 L1P 进行高速缓存

    缓存;L2不会缓存对 MSMC SRAM 的请求。

    •共享3级内存—MSMC 内存不能在 L2直接高速缓存、

    但可在 L1D 和 L1P 中高速缓存。 但是、如果它被重新映射到一个外部地址

    使用 C66x CorePac MPAX 中的地址扩展功能、MSMC

    在 L1和 L2缓存中、存储器可作为共享 L3存储器进行缓存。 更改为

    为此、必须在 MAR 寄存器中启用缓存(使用 MAR.PC 位)

    映射的区域。

    如线程中所述

    MSMC RAM–通常用作共享2级内存。 勘误表显示必须禁用预取或将 MSMC 配置为共享3级存储器。 预期在禁用预取时性能会更好。

    OpenMP 情况属于类别- MSMC 配置为共享3级内存、因此勘误表28不适用。

    此致、
    Garrett

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

    您好、Garrett、

    感谢您的回复。  

    OpenMP 运行时有2个源自 MSMC SRAM 的内存段。 其中一个用于不可高速缓冲 SRAM (它实际上是 MSMC 存储器的一部分、但它被 MPAX 重新映射到某些已知地址范围、然后被相关 MAR 配置禁用高速缓存)。 另一个是纯 MSMC SRAM、它在运行时配置为可缓存和可预取。

    以下是 C:\ti\openmp_dsp_c667x_2_06_02_01\packages/ti\runtimes\ompbios\OpenMP*中的相关代码

    if (OpenMP*) hasMsmc)

    _TI_setMPAX (OpenMP*) mpaxForMsmcMapping、
    OpenMP* msmcNoCacheVirtualBase、
    OpenMP* msmcNoCachePhysicalBase,0x10 // 128 KB */);
    _TI_omp_disable_caching (OpenMP*是一个高速缓存)
    OpenMP* msmcNoCacheVirtualSize);

    /*为 MSMCSRAM 启用缓存*/
     _TI_omp_enable_caching (OpenMP* msmcBase、OpenMP* msmcSize);

    其他

    _TI_omp_disable_caching (OpenMP*版) ddrNoCacheBase、OpenMP*版 ddrNoCacheSize);

    因此、我仍然认为可高速缓存和可预取的 MSMC SRAM 应视为2级存储器、并且应注意通报。 你怎么看?

    此致、
    NK

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

    新年快乐! 嗯,你对此有什么进一步的建议吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Naoki、

    谢谢! 我不理解您在上一篇文章中的观点,认为您发布的代码是在某个点为 OpenMP* msmcNoCacheVirtualBase()启用高速缓存。

    看起来勘误建议28未应用于 OpenMP 运行时。 我创建了一个 JIRA、用于在内部跟踪此情况。

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

    感谢您签发 TT 以解决问题。 同时、我建议客户自行修改运行时。
    我现在关闭线程。

    此致、
    NK