工具/软件:TI-RTOS
您好!
我正在寻找一个获取两个浮点值并返回和(也是浮点值)的内在函数。
我仅找到 "__float2_t _daddsp (__float2_t,__float2_t);"
但我不希望 包含两个浮点值的类型"__float2_t"-它对于我的用途来说太大了。
在哪里可以找到该函数?
谢谢、
Ronen
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.
工具/软件:TI-RTOS
您好!
我正在寻找一个获取两个浮点值并返回和(也是浮点值)的内在函数。
我仅找到 "__float2_t _daddsp (__float2_t,__float2_t);"
但我不希望 包含两个浮点值的类型"__float2_t"-它对于我的用途来说太大了。
在哪里可以找到该函数?
谢谢、
Ronen
如果要同时添加许多对浮点数字,则_daddsp()是您要查找的内在函数。 为什么您说_float2_t 太大、不适合您的用途?
在机器码级别,_daddsp()映射到 DADDSP 指令。 TI 文档 SPRUGH7指出、DADDSP 可以在四个执行单元中的任何一个上运行:.L1、.L2、.S1或.S2。 这个指令将两个寄存器对作为输入、并生成一个寄存器对作为输出。 这意味着、如果寄存器中有八个_float2_t 值、则可以在单个周期中最多发出四条 DADDSP 指令、添加八对浮点值。 如果您看一下 TI 针对 C66x 器件的"最大 GFLOPS"数字、它每周期可处理16个 FLOPS、一种方法是使用四个 DADSP 加两个 QMPYSP。 存储器带宽通常是此类操作的限制因素、部分原因是.L1和.L2单元也负责所有存储器加载和存储。
您好、Michael、
感谢您的回答!
您询问"为什么您说_ float2_t 太大、不适合您的用途?"
我 看到- typedef double __float2_t; 这意味着它不是浮点型-它是双精度型(64位而不是32位),这就是它对我来说太大的原因。
其次 ,根据您的回答,可以在一个周期中添加8个浮点值,您能给我一个代码示例吗?
C66x 设计团队的底线是:"我的意思是硬件不能在单个功能单元上启用4个浮点加法运算"
所以我有点困惑,因为你有冲突的答案 ,你能帮我清除吗?
谢谢、
Ronen
Ronen、
"double"类型仅显示、因为需要64位来保持两个单精度浮点值、而"double"类型是64位浮点类型。 用户可能希望编译器将__float2_t 识别为内置矢量类型,但不会识别它。 我认为 CGT 8.x 确实会识别诸如"float2"之类的 OpenCL 激励类型、但它们可能无法与内在函数配合使用。 无论类型名称是什么、它最终都会在 DSP 内核中使用两个连续编号的寄存器:一个偶数寄存器和以下奇数寄存器(例如 A2和 A3)。
您发现的帖子是正确的:C66x ISA 不提供在单个功能单元上执行四个浮点加法运算的任何方法。 在我之前的答复中、我提到了四个功能单元、每个功能单元都可以通过 DADDSP 指令在一个周期中执行两个浮点加法:.S1、.S2、.L1和.L2单元。 软件必须使用所有这四个值来实现每个周期八个浮点加法。 这与.M1和.M2功能单元形成对比、每个功能单元可在每个周期执行四次浮点乘法(使用 CMPYSP 或 QMPYSP 指令)。 SPRUGH7等 TI 文档详细介绍了不同的功能单元。
Michael