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.

[参考译文] MSP430FR5994:包含1列矢量的 LEA matmult 给出了错误的结果

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/711123/msp430fr5994-lea-matmult-with-1-column-vector-giving-wrong-result

器件型号:MSP430FR5994

大家好、我遇到了 LEA 的怪异行为。

我正在尝试使用库函数 MSP_matrix mpy_Q15使用 Q15数据类型进行矩阵乘法

我的代码可与(2x2 maxtrix)*(2x2矩阵)正确配合使用。

但是、它不适用于(2x2矩阵)*(2x1矩阵)。

此外、如果我关闭 LEA、结果是正确的。

DSPLIB_DATA (LEA_src1、4)_Q15 LEA_src1[2]={{_Q15 (0.1)、_Q15 (0.2)}、{_Q15 (0.3)、_Q15 (0.4)}};
DSPLIB_DATA (LEA_src2、 4)_Q15 Lea_src2[2][1]={{_Q15 (0.1)}、{_Q15 (0.3)}};
DSPLIB_DATA (Lea_dest、4)_Q15 Lea_0.15[2][1];
__NV _Q15 Expected [2][1]={_Q15}

(main)(0.07)}(t)

MSP_STATUS 状态;
MSP_matrix mpy_q15_params mpyParams;

WDTCTL = WDTPW + WDTHOLD;

mpyParams.srcARows = 2;
mpyParams.srcACcols = 2;
mpyParams.srcBRows = 2;
mpyParams.srcBCcols = 1;

状态= MSP_match_mpy_q15 (&mpyParams、* Lea_src1、* Lea_src2、* Lea_dest);

返回0;

}

以上是我的代码。 非常简单、在没有 Lea 的情况下工作正常、但在 Lea 的情况下、结果是错误的。

具体而言、输出应为{0x8F5、0x1333}、但 Lea_dest 中的值为{0x8F5、0x1ae0}。

再说一次、如果我执行平方矩阵乘法、我没有这个问题。

为什么会发生这种情况? 我有什么问题吗?

谢谢你。

此致、

Kiwan Maeng

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过更彻底地检查装配体、我找到了至少一个问题。
    MSP_LEA_convert_address()宏将地址除以4、包括 SRCA 和 DST。
    SRCA 和 dst 在每次迭代中由 srcACcols 和 srcBCcols 递增、因此、为了有意义、srcACcols 和 srcBCcols 应至少为2
    (因此 dst 和 SRCA (即_Q15*)每次至少上升4个)、这意味着单列矩阵无效。
    我假设代码是这样编写的、因为 LEA 只能将4个字节用作输入地址。 如果是这样、单列矩阵无论如何都没有意义。
    不过、如果我的假设是正确的、我想知道为什么没有在任何地方记录它、以及为什么没有用于检查列大小的断言。
    此外、我想知道 LEA matmult 还有哪些其他限制、以及在哪里记录了这些限制。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Kiwan、

    矩阵乘法函数 MSP_match_mpy_Q15 ()采用 MSP_match_mpy_Q15_params 结构来指示矩阵的大小(正如您在示例中设置的那样)。 根据 API 指南、矩阵的行和列必须是2的倍数才能使函数正常工作。 在 CPU 情况下、它可能会正常工作(正如您所观察到的)、但这种行为不能得到保证。

    software-dl.ti.com/.../structmsp__matrix__mpy__q15__params.html

    作为一个附带注释、对于如此小的矩阵、由于设置 LEA 的开销、使用 LEA 没有显著的执行时间优势。 当矩阵较大时、LEA 会带来很多好处。

    Walter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 未看到 API 指南。 谢谢!