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.

[参考译文] 编译器/TMS320C6657:向量类型怪异

Guru**** 2601915 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/608767/compiler-tms320c6657-vector-types-weirdness

器件型号:TMS320C6657

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

这为什么不能正常工作?:

内联 void VectVec (float const *x、float const *y、float *z、int len)
{
int n;
float16 *v1、*v2、*v3;

v1 =(float16*) x;
V2 =(float16*) y;
v3 =(float16*) z;

len >=4;

#pragma MUST_ITERATE (1、、)
for (n = 0;n < len;n++)
*v3++=*v1++**v2++;
} 


它的运行速度快于"自然"C 代码、但结果是意外的。  参数都保证与16字节边界对齐、len 始终是16的倍数。

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

    这是哪个 SDK? 还是使用裸机代码?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不理解这个问题。 它是 C 代码。 它使用的是 C6x 矢量类型(#include C6x_vec.h)。 使用 SYS/BIOS (或本月重命名的任何内容)和最新编译器的 Code Composer Studio。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人吗? Bueller?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们需要做些什么才能让他人了解这一点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    len 是否可能是数组中元素的长度、而不是字节数? 在这种情况下、"lwn >=4"会错误、并且会导致极少的迭代。 (据我所见、float16是由4个浮点值(即16字节)组成的向量类型)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据编译器手册:
    floatn:n 个32位单精度浮点值的向量。

    TI 为何不回复? 已经一周了。 我希望这并不表示我们期望得到的支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我们将对此进行研究。 很抱歉耽误你的时间。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、此问题的响应延迟。 该问题与 TI C6000编译器有关、但已发布在器件论坛上。

    我已将该主题移至 TI 编译器论坛、并已联系编译器专家进行响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据我在这里看到的情况、我无法确定导致问题的原因。  请提交测试用例。  在这种情况下、我希望有一个可以执行的测试用例。  因此、请提供提供输入数据的代码并检查结果是否正确。  我们还需要了解编译器版本以及编译器所看到的所有编译选项。  如果对您来说更简单 、请随意将所有内容组合在 CCS 项目中、然后按照文章 Project Sharing 中所述对其进行打包。

    谢谢、此致、

    乔治

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

    我可能会弄乱 C 或 OpenCL、但我也看到了一个问题。  运行 OP 的原始函数仅计算前两个浮点值的结果、这似乎不正确。  非内联版本提供了所有16个浮点值的值、但它们看起来都不正确。  中断指针操作的版本似乎可以正常工作。  使用索引而不是指针操作的版本似乎可以正常工作。

    #include 
    
    内联 void VectVec (float const *x、float const *y、float *z、int len)
    {
    int n;
    float16 *v1、*v2、*v3;
    
    v1 =(float16*) x;
    V2 =(float16*) y;
    v3 =(float16*) z;
    
    len >=4;
    
    #pragma MUST_ITERATE (1、、)
    for (n = 0;n < len;n++)
    *v3++=*v1+**v2++;
    }
    
    void VectVec2 (float const *x、float const *y、float *z、int len)
    {
    int n;
    float16 *v1、*v2、*v3;
    
    v1 =(float16*) x;
    V2 =(float16*) y;
    v3 =(float16*) z;
    
    len >=4;
    
    #pragma MUST_ITERATE (1、、)
    for (n = 0;n < len;n++)
    *v3++=*v1+**v2++;
    }
    
    内联 void VectVec3 (float const *x、float const *y、float *z、int len)
    {
    int n;
    float16 *v1、*v2、*v3;
    
    v1 =(float16*) x;
    V2 =(float16*) y;
    v3 =(float16*) z;
    
    len >=4;
    
    #pragma MUST_ITERATE (1、、)
    for (n = 0;n < len;n++)
    v3[n]= v1[n]* v2[n];
    }
    
    内联 void VectVec4 (float const * x、float const * y、float * z、int len)
    {
    int n;
    float16 * v1、* v2、* v3;
    
    v1 =(float16*) x;
    V2 =(float16*) y;
    v3 =(float16*) z;
    
    len >=4;
    
    #pragma MUST_ITERATE (1、、)
    for (n = 0;n < len;n++)
    {
    //*(v3++)=(*(v1++))*(*(v2++));
    * v3 =* v1 **** v2;
    v1+;
    v2++;
    v3++;
    }
    
    
    
    }int main ()
    {
    浮点 x[16]={1、2、3、4、5、 6、7、8、9、10、 11、12、13、14、15、 16};
    float z[16]={};
    
    VecMultVec (x、x、z、16);
    VecMultVec2 (x、x、z、16);
    VecMultVec3 (x、x、z、16);
    VecMultVec4 (x、x、z、16);
    
    返回0;
    } 

    C6655、CGT 8.2.1e2e.ti.com/.../Test_5F00_proj.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这就是我们看到的确切问题。 仅计算前两个值。 它与使用指针有关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提交测试案例。  我可以重现相同的错误结果。  我在 SDOWP 系统中提交了 CodeGen-3613、以进行调查。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治

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

    是的,“*v3++”部件出现问题,导致其写入错误的位置。

    我认为权变措施是指定--opt_level=1或更高版本。  问题似乎是特定于--opt_level=0的,这就是您在没有任何--opt_level 选项的情况下指定--vectypes=on 时得到的结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、但这不正确。 我们发现-opt_level=1或更高版本存在此问题。 实际上、CCS 会强制您在使用--vectypes 选项时启用优化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我没有显示该情况的测试用例。 user347219中的情况与-o1的行为确实正确、正如我所说的那样。
    如果您可以向我们发送说明您情况的修补程序,我也可以确保我的修补程序修复了这种情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、现在您说您有一个补丁? 设置--opt_level=1不是一个"修补程序",它是一个权变措施。 不管怎样、这都是一个很重要的问题、因为它不能与我们的软件配合使用。 您是否尝试过其他优化级别?

    除了我们的实际项目之外、我没有其他测试项目、这是几百个文件、我需要花几周时间由律师起草 NDA 供我分享。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、它大约在一个小时前完成了代码审核。 但是、发布需要一些时间、而权变措施可能允许您的代码同时工作。 不妨考虑一下、您已经在发布的示例中建议了其他权变措施。

    我们不太可能需要整个项目来重现您的问题、但这听起来也是没有意义的。 如果使用"-src_interlist --keep_asm"(-sk 表示 short)进行编译,并查看类似"*((float *) v3 <float<[16]> *++{64 }+4)"的存储,它们同时具有++和+integer,则可能是同一个问题。

    我们希望补丁版本能为您解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、我没有看到 Paul 的回复。  似乎问题已经解决。  谢谢!


    -元