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.

[参考译文] TDA2EVM5777:Vision SDK VXLIB:需要提高直方图算法性能。

Guru**** 2590550 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/641459/tda2evm5777-vision-sdk-vxlib-histogram-algorithm-performance-improvement-help-required

器件型号:TDA2EVM5777

您好!

我使用 Vision SDK VXLib API 实现了直方图算法、我只需调用两个 API、DSP 上的电流为32%。


图像格式为 YUV422。 我已经完成了性能评测,以下是图像宽度= 1280、高度= 720、跨度= 2560的结果。

VXLIB_channelExtract_1of2_i8u_o8u (大约需要3414337个 CPU 周期)

VXLIB_Histogram i8u_o32u (大约需要2630963个 CPU 周期)

请指导我如何优化此算法吗?

如果需要、我可以在此处粘贴代码、请提供帮助。

谢谢、

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

    我已将您的问题转交给 VXLIB 专家。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以通过提高性能
    (a)确保已启用高速缓存或
    (b)使用 DMA 获取 L2中的数据并从 L2运行。

    DMA 的一个示例可在 DMAUtils 封装中找到 \test\EDMA_utils_autoIncrement_1D_test

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

    我本周不在办公室、因此我无法在我的板上确认您的结果。  在平均时间内,您可以尝试以下简单的修复程序以利用高速缓存获得性能:

    //设置 bufparams 以获得正确的宽度,但高度= 1;

    for (i=0;<height; i++)

        //调整指针以指向通道提取输入/输出和直方图输入的每一行的开头

        VXLIB_channelExtract_1of2_i8u_o8u

        VXLIB_Histogram i8u_o32u

    这将降低直方图的缓存缺失率。

    我下周返回时、可以检查您的周期计数是否与我预期的相符。

    为了获得更好的性能、您可以考虑使用 DMA 以乒乓方式将 DDR 线路引入 L2SRAM、以便将数据访问开销与计算不同缓冲区并行隐藏。

    Jesse

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

    您好!

    感谢您的回复、我已经尝试了您的部分建议、但我认为我不理解如何实施"考虑使用 DMA 以乒乓方式将 DDR 中的行引入 L2SRAM "、因此只需将高度= 1即可增加 CPU 使用率。

    您能否给我们指出一些实施"考虑使用 DMA 以乒乓方式将 DDR 中的行引入 L2SRAM "的良好示例代码?

    我将代码示例附在此处、以便您更好地理解、请参阅随附的文件。

    e2e.ti.com/.../histogram.c

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您附上代码。 这很有帮助。

    将高度设置为1应该会减少 CPU 使用率。 我注意到您的代码的一件事是、您的 for 循环中现在有一个 print 语句。 这可能是循环次数增加的原因... 尝试删除此语句。 此外、环路内有一个系统配置开始和结束、如果删除这些、则总组合函数周期计数应准确。

    关于 DMA 示例、Pramod 在前一个答复中提到了一个示例:

    "DMA 的一个示例可以在 DMAUtils 封装中找到 \test\EDMA_utils_autoincrement_1D_test"

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

    您好!

    感谢您的回复、很抱歉您对给定代码的理解有误。

    实际上、如果不使用 print 语句和分析代码、只使用两个 VXLIB API 调用、它所花费的时间大约为31%、这是我后来添加分析代码来检查所花费 CPU 周期数的原因。

    我正在尝试乒乓缓冲器示例、但同时如果您可以在您的一侧检查我的代码、这将非常有帮助。

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否说代码的版本(height = 1、在整个高度循环中使用这两个内核(删除了打印件)时使用的是31%、而调用第一个内核之后是第二个内核的代码加载的是32%? 我希望高度= 1时的负载至少比负载低1/4。 如果删除了打印稿,代码看起来是正确的。 您可能希望将 bufParams 的直方图初始化移动到循环外部、因为它不会针对每次迭代发生变化、并且会浪费循环内的周期。

    我看到您还使用堆栈分配中间缓冲区。 您可能希望将其分配到 L2SRAM 中、以便它不会被淘汰、但我不希望这会产生巨大的影响。

    我已确认您在仅使用缓存运行完整帧时发布的有关这2个函数周期的初始结果。 似乎已启用高速缓存、这很好。

    通道提取 API 具有非常高的数据 I/O 限制、因为基本上没有计算。 仿真器(就像数据已在 L1中一样)显示每像素0.18个周期、因为它只是一个 SIMD 加载、打包和存储操作。 它绑在 D 单元上、而其他单元在很大程度上处于空闲状态。 从高速缓存运行内核时、性能受高速缓存丢失率的限制、平均每像素可减少到3.5 - 4.5个周期。 如果您有一些计算函数花费了超过4或5个周期的仿真器计算、则缓存缺失率不会对性能产生太大的影响、因为 CPU 的负载会更大。 给定每个内核的仿真器性能数据、您可以估计哪些内核可使用缓存完成、而哪些内核会影响最小、而其他类似的内核则会受到缓存丢失率的影响。

    当内核在 L2SRAM 中已有的数据上运行时、性能会提高到每像素0.5到1.0个周期之间。 因此、性能的最大改进是利用 DMA 将输入数据的线路(或块)引入 L2SRAM。 您可以参考 Pramod 引用的示例。 或者、如果您想使用 BAM 框架、可以参考 OpenVX 使用的示例:c./ti_compons/open_compute/TIOxvx_01_00_00/内核/openvx-core/c66x/bam。 请注意、这些函数适用于 OpenVX、但如果您希望包含 bam_wrapper 函数头文件、则可以调用单个/多个 BAM 图函数。

    2.对于直方图内核、仿真器显示每像素1.26个周期。 使用高速缓存时、性能同样会受到高速缓存丢失率的影响、并且性能会降低到每像素2.5-2.8个周期。 但是、当数据位于 L2SRAM 中时、性能通常恢复到每像素1.5个周期。 因此、将其与使用 DMA 的通道提取放在一起会有所帮助。

    3.最后,如果您在执行此操作后需要更高的性能,则可以选择将这两个内核合并到单个内核中。 这意味着创建一个新的内核、该内核从原来的2个 VXLIB 内核中借用逻辑来利用流水线。 此新内核的每像素周期数可能低于2个单独内核的总和。

    此致、
    Jesse