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.

[参考译文] AM2754-Q1:C7x 库优化对齐要求

Guru**** 2439710 points
Other Parts Discussed in Thread: MATHLIB, FFTLIB

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1542094/am2754-q1-c7x-optimized-library-alignment-requirements

器件型号:AM2754-Q1
主题中讨论的其他器件:MATHLIBFFTLIB

工具/软件:

您好团队:

我一直在努力 在 FFTLIB、DSPLIB、MATHLIB 内核上创建包装器、用于在 AM275 EVM 上运行 C7x 优化应用。 我已经遵循了相应库中的测试驱动程序、无法看到处理缓冲区在分配/设置期间显式对齐到 128 字节/64 字节、如下所述。

FFTLIB

 例如、在测试驱动程序的源 freertos_sdk_am275x_11_00_00_16/source/fftlib/test/fft7x/FFTLib_fft1d_i32f_c32fc/FFTLib_fft1d_i32f_c32fc_o32fc.c 中、我请参阅

pX = (FFTLIB_F32 *) TI_memalign(128, numPoints * 2 * sizeof(FFTLIB_F32));

还有一条注释:
/* pX is required to be 16-byte aligned for streaming engine use in kernel */
这有点令人困惑。

DSPLIB

 例如、在测试驱动程序源 freertos_sdk_am275x_11_00_00_16/source/DSPLIB/test/DSPLIB_fir/DSPLIB_fir_d.c 中、 我请参阅

void *pIn = (void *) TI_memalign(DSPLIB_L2DATA_ALIGNMENT, bufParamsIn.stride_y * bufParamsIn.dim_y);
其中、 DSPLIB_L2DATA_ALIGNATION 在 DSPLIB_types.h 中定义为:

#define DSPLIB_ALIGN_SHIFT_64BYTES 6  //!< Number of bits to shift for 64-byte memory alignment
#define DSPLIB_ALIGN_SHIFT_128BYTES 7 //!< Number of bits to shift for 128-byte memory alignment
#define DSPLIB_ALIGN_SHIFT_256BYTES 8 //!< Number of bits to shift for 256-byte memory alignment

#define DSPLIB_ALIGN_64BYTES (1 << DSPLIB_ALIGN_SHIFT_64BYTES)   //!< Align by 64-byte memory alignment
#define DSPLIB_ALIGN_128BYTES (1 << DSPLIB_ALIGN_SHIFT_128BYTES) //!< Align by 128-byte memory alignment
#define DSPLIB_ALIGN_256BYTES (1 << DSPLIB_ALIGN_SHIFT_256BYTES) //!< Align by 256-byte memory alignment

#define DSPLIB_L2DATA_ALIGN_SHIFT DSPLIB_ALIGN_SHIFT_64BYTES //!< Set the default L2 data alignment

/** @brief Macro that specifies the alignment of data buffers in L2 memory for
 * optimal performance */
#define DSPLIB_L2DATA_ALIGNMENT (((uint32_t) 1) << ((uint32_t) DSPLIB_L2DATA_ALIGN_SHIFT))
这意味着  DSPLIB_L2DATA_ALIGNATION  等于  64.

MATHLIB

 例如、在测试驱动程序源 freertos_sdk_am275x_11_00_00_16//source/mathlib/test/MATHLIB_cos/MATHLIB_cos_test.cpp 中、 我看到:
pSrc = (T *) MATHLIB_memalign(MATHLIB_L2DATA_ALIGNMENT, length * sizeof(T));
其中、 MATHLIB_L2DATA_ALIGNATION  MATHLIB_memory.h 中定义为:

#define MATHLIB_ALIGN_SHIFT_64BYTES 6  //!< Number of bits to shift for 64-byte memory alignment
#define MATHLIB_ALIGN_SHIFT_128BYTES 7 //!< Number of bits to shift for 128-byte memory alignment
#define MATHLIB_ALIGN_SHIFT_256BYTES 8 //!< Number of bits to shift for 256-byte memory alignment

#define MATHLIB_ALIGN_64BYTES (1 << MATHLIB_ALIGN_SHIFT_64BYTES)   //!< Align by 64-byte memory alignment
#define MATHLIB_ALIGN_128BYTES (1 << MATHLIB_ALIGN_SHIFT_128BYTES) //!< Align by 128-byte memory alignment
#define MATHLIB_ALIGN_256BYTES (1 << MATHLIB_ALIGN_SHIFT_256BYTES) //!< Align by 256-byte memory alignment

#define MATHLIB_L2DATA_ALIGN_SHIFT MATHLIB_ALIGN_SHIFT_64BYTES //!< Set the default L2 data alignment

/*! @brief Macro that specifies the alignment of data buffers in L2 memory for
 * optimal performance */
#define MATHLIB_L2DATA_ALIGNMENT (((uint32_t) 1) << ((uint32_t) MATHLIB_L2DATA_ALIGN_SHIFT))
这意味着  MATHLIB_L2DATA_ALIGNATION 等于  64.
 
现在、我想了解:
  1. 如果在测试驱动程序中看到的上述显式对齐是为了高效运行优化内核而处理缓冲区的硬性要求吗? 您能否证实这一点? 如果是、您能否在 FFTLIB、DSPLIB 和 MATHLIB 内核中为它们指定对齐要求?
  2. 一般平台数据对齐要求是什么? 不是 16 字节? 如果我将常规数据对齐用于传递给 内核的处理缓冲区、是否会在效率上有所折衷?

我在提供的文档中找不到此信息。  如果上述问题得到答复、并在图书馆文件中提供了对上述内容的任何提及、我将不胜感激。

此致、
Sreekanth

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

    您好、Sreekanth、

    根据 C71x DSP Corepac TRM:

    L1D 可以在每个周期向 CPU 维持 512 位数据(64 字节)、而 L2 可以在每个周期向流引擎提供 1024 位数据(128 字节)。

    DSPLib、FFTLib 和 MathLib 将默认 L2 数据对齐设置为 64 字节。 我猜是 64 字节是 L2 数据对齐的最低要求。 为了实现最佳 C7x 性能、您需要 将默认的 L2 数据对齐设置为 128 字节。

    此致、

    Ming

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

    您好 Ming、

    感谢您的回答。 我看到、在 DSPLIB 中、FIR 和级联双二阶滤波器的测试驱动器使用 64 字节对齐 缓冲器、而在 FFTLIB 中、测试驱动器明确使用 128 字节对齐数组作为缓冲器。 因此、根据您的说法 、为了优化流引擎执行、建议 对作为输入传递到 FFTLIB、DSPLIB 和 MATHLIB 中任何内核的所有缓冲区使用 128 字节对齐。 我明白了吗?

    此致、
    Sreekanth

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

    您好、Sreekanth、
    是的、您的理解是正确的。

    谢谢、

    Shreyansh