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.
您好!
我`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、
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