大家好、
例如、我想使用 memcpy 将存储器块从"MSMC 复制到 DDR"、反之亦然。 L2 (作为256KB)和 L1 (作为32KB)被启用为缓存。 当我传输512KB 时、L2高速缓存保存了一些未被写回的存储器值。 当我执行 cache_wb 时,它在整个 L2高速缓存上运行并降低性能。 我只想写回脏数据。 获取指针参数的 cache_wb 函数无法正常工作、因为由于大块大小的传输、指针地址在高速缓存中将无效。
考虑高速缓存、传输内存块的正确方式是什么?
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.
大家好、
例如、我想使用 memcpy 将存储器块从"MSMC 复制到 DDR"、反之亦然。 L2 (作为256KB)和 L1 (作为32KB)被启用为缓存。 当我传输512KB 时、L2高速缓存保存了一些未被写回的存储器值。 当我执行 cache_wb 时,它在整个 L2高速缓存上运行并降低性能。 我只想写回脏数据。 获取指针参数的 cache_wb 函数无法正常工作、因为由于大块大小的传输、指针地址在高速缓存中将无效。
考虑高速缓存、传输内存块的正确方式是什么?
您好!
您可以使用:
void cache_writeback (void *ptr、int 大小)
{
#ifdef _TMS320C6x
uint32_t 密钥;
/*禁用中断*/
KEY =_disable_interrupts ();
cache_wbL1d (ptr、大小、cache_bence_wait);
cache_wbL2 (ptr、size、cache_fence_wait);
/*重新启用中断。 *
RESTORE_INTERRUPTS (KEY);
}
其中指针地址可以是 DDR 或 MSMC 地址和大小、可以使用32768 (32KB)。
如果您需要更高的性能、请考虑使用 EDMA 进行传输。
此致、Eric
您好!
您的指针指向 MSMC、DDR 或 L2中的地址、对吧?
对于 MSMC:
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 位)
映射的区域。
对于 DDR3:缓存到 L2中。
因此、在缓存函数的上方:L1D 和 L2上的 void cache_writeback (void * ptr、int size)可实现此目的。
此致、Eric
您好!
我想您之前问过同样的问题 、https://e2e.ti.com/support/processors/f/791/t/865597。 什么未解决?
此致、Eric
实际上、这些部件是很清楚的。 除了这个问题、L2到 DDR 的传输和 DDR 到 L2的传输之间还有很大的吞吐量差异。 L2到 DDR 的传输具有 DDR 到 L2的几乎一半吞吐量。 你对此有什么意见吗?
首先、我认为这是因为高速缓存策略。 在 DDR 到 L2的情况下、只有 DDR 值缓存在 L1D 和 L2_cache 中。 但在 L2_ram 到 DDR 的情况下、L2_ram 缓存在 L1D 中、DDR 值缓存在 L2_cache 中。 因此、对于 L2_ram 到 DDR、我还必须执行写回操作以正确测量吞吐量。
总而言之、我想说一个新项目、我可以在所有 DSP 内核的同时、真正地强调 DDR。 此外、使用此示例代码"*DDR_ptr = constant _value;DDR_PTR++"测试 DDR 可能有助于更好地了解对不同内核的优先级分配。
谢谢你。
您好!
我们没有 L2和 DDR3之间的 CPU 基准编号。 要对 DDR 施加压力、必须并行使用3-4个 EDMA 通道、而不是 CPU。
但从线程中、您的目标是使用具有不同总线优先级的8个 CPU 进行测试、我不确定代码是如何编写的(memcpy?、指针操作?)、测量的开始和结束位置以及两者之间是否有任何缓存操作、因此我无法进行注释。 如果需要进一步研究、您需要提供代码(例如 CCS 项目)。
此致、Eric
为了简单起见、我将提供伪代码/流程;
-所有内核均使用 CSL_XMC_setMDMAPriority (num)设置其优先级;
主内核在共享存储器中设置一个位并设置;
-其他内核轮询该位,如果未设置,则循环该位;
-内核启动计时器;
-内核针对指定的有效载荷从不同位置(DDR 到 L2、L2到 DDR 等)生成并发 memcpy();
-内核在必要时调用 cache_writeback;
-内核停止计时器并测量吞吐量。