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.

[参考译文] 编译器/DRA829V:C66如何正确编写代码以利用每个时钟周期的全部8个浮点运算

Guru**** 2556110 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/898493/compiler-dra829v-c66-how-write-code-properly-to-exploit-the-full-8-floating-point-operations-per-clock-cycle

器件型号:DRA829V

工具/软件:TI C/C++编译器

大家好,  

我需要 利用每个周期的全部8个浮点运算。

例如、据我所知、只有在使用内在函数"_qmpysp"时、编译器才能生成4路 SIMD 形式的单精度乘法"QMPYSP"。

为了开始编写干净的代码、我尝试将这些 QMPYSP 中的2个放入函数中(并获取8个 flop/cycle)、并从代码的内部循环调用此函数。 我想让编译器生成一对 SPLOOP/SPKERNEL、就像2个 QMPYSP 直接写入内部循环中一样、无需任何函数调用。

我已经尝试了以下代码、但没有成功:

 

typedef 结构{

  _x128_t lo;

  _x128_t hi;

} f32_x8_operal_t;

 

#pragma FUNC_IS_PURE (F32_mul_x8)

#pragma NO_HOOKS (F32_mul_x8)

#pragma FUNC_ALWAYS_INLINE (F32_mul_x8)

静态 F32_x8_operation_t F32_mul_x8 (F32_x8_operation_t src0、F32_x8_operation_t src1)

{  

  f32_x8_operal_t dst;

  

  dst.lo =_qmpysp (src0.lo、src1.lo);

  dst.hi =_qmpysp (src0.hi、src1.hi);

 

  返回 dst;

总之、函数主体是正确内联的、但绝不在 SPLOOP/SPKERNEL 对之间、而是存在正常的分支操作。 我想、正常分支无法利用硬件中的循环流水线(只有次序外的流水线才能实现这一点)。

你有什么建议吗?  

谢谢

卡洛

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

    为了了解如何通常使用_qmpysp 内在函数、我建议您为 C66x 安装 DSPLIB。  检查源文件 DSPF_sp_mat_mul_gemm.c  它位于路径类似于...的目录中。

    C:\ti\dsplib_c66x_3_4_0_0\packages/ti\dsplLib\src\dsppsp_fm_mat_mul_gemm\c66

    了解它如何使用内在函数_qmpysp。  您的用途应该类似。   

    [引用 USER="Colombo Carlo"]我想让编译器生成一对 SPLOOP/SPKERNEL,就像2个 QMPYSP 直接写入内部循环中一样,而无需任何函数调用。[/QUERPES]

    编译器为此 DSPLIB 函数生成的汇编代码在软件流水线循环内并行包含两条 QMPYSP 指令。

    也许解决问题的更好方法是在 DSPLIB 中调用此函数或类似函数。

    谢谢、此致、

    乔治

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

    你(们)好  

    谢谢,但我需要更多的东西。

    我 使用 了_qmpysp 内在函数、正如我在示例代码中所示。  我需要将其封装到函数"F32_mul_x8"中、并在 C 循环中调用此函数。 我希望通过编译器优化(即函数内联、然后通过硬件循环)将此 C 循环转换为 HW 循环 SPLOOP/SPKERNEL。

    从编译器优化的角度来看、就我尝试过的情况而言、硬件循环传递似乎是在函数内联之前进行的、这说明了为什么它不按我的预期工作。 如果我将"F32_mul_x8"重写到 C 宏(脏解决方案)中、我的实验将按我的预期工作。 我想知道是否有一个#pragma 能够解决该问题。

    有什么建议?

    此致

    卡洛

     

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

    考虑使用#pragma FORCEINLINE#pragma FUNC_ALWAYS_INLINE。  这两个 pragma 都会影响内联。  否则、它们会有很大不同。  请在 C6000编译器手册中搜索它们

    谢谢、此致、

    乔治