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

