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.

[参考译文] 66AK2H12:memcpy()和 cache_writeback 集成

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/877599/66ak2h12-memcpy-and-cache_writeback-integration

器件型号:66AK2H12

大家好、

例如、我想使用 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

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

    是的、正确。

    因此、当我执行 L2到 DDR 传输时、我只需要 cache_writeback。

    对于 DDR 到 L2、MSMC 到 L2和 L2到 MSMC 传输、我不需要调用 cache_writeback。

    我的目标是通过同时更改8个内核的 MDMA 优先级来测量带宽变化。 我想为它编写一个程序、但我不确定应该如何编写它以获得最佳结果。

    谢谢你。

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

    您好!

    我想您之前问过同样的问题 、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;

    -内核停止计时器并测量吞吐量。

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

    您好!

    感谢您的解释! 我还有其他优先事项、编写此类测试用例进行测试需要一些时间。 请上传显示该问题的 CCS 项目、以便我可以尝试进行调试。

    此致、Eric