工具/软件: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 对之间、而是存在正常的分支操作。 我想、正常分支无法利用硬件中的循环流水线(只有次序外的流水线才能实现这一点)。
你有什么建议吗?
谢谢
卡洛