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.

[参考译文] 编译器/TMS320C6678:优化编译和性能、带/不带 RTSC/OMP

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/803117/compiler-tms320c6678-optimized-compilation-and-performance-with-without-rtsc-omp

器件型号:TMS320C6678

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

你(们)好。

我在没有 RTSC (FAST)和 RTSC (慢速)的情况下运行函数时遇到一些性能问题。

在第一个示例中、我链接以下 C6678.cmd:

内存
{
SHRAM: o = 0x0C000000 l = 0x00400000 // 4MB 多核共享内存*/

CORE0_L2_SRAM:O = 0x10800000 l = 0x00080000 // 512KB CORE0 L2/SRAM *
CORE0_L1P_SRAM:O = 0x10E00000 l = 0x00008000 // 32kB CORE0 L1P/SRAM */
CORE0_L1D_SRAM:O = 0x10F00000 l = 0x00008000 // 32kB CORE0 L1D/SRAM */
//继续 Core1-CORE7
}
SECTIONS
{
#ifdef CORE0
myfastsection > CORE0_L2_SRAM
.text:优化:load >> CORE0_L2_SRAM
//继续使用其他段,所有这些段都放置在 L2SRAM
中} 

相应的函数被放置在.text 中:使用#pragma CODE_SECTION 进行优化、使用#pragma DATA_SECTION 将数组放置在.myfastsection 中、并使用#pragma DATA_ALIGN (.、2)进行双字对齐。 性能非常令人满意、并且查看生成的汇编代码、编译器似乎很好地进行流水线处理。

第二个示例中。 我要添加一些 RTSC、因为在某些其他代码段(与上述代码段无关)中、我计划使用 OMP。 但是、使用相同的编译器选项进行优化时、上述函数的性能会显著下降(使用 TSCL 和 omp_getwtime 测量的速度的一半)。 为该函数生成的汇编代码是相同的。 我的第一个猜测是我对存储器部分执行了错误操作? 我已添加修改的 cfg 文件中的值  


program.sectMap[".text:optimized"]= new Program.SectionSpec ();
program.sectMap[".myfastsection"]= new Program.SectionSpec ();
program.sectMap[".text:optimized"].loadSegment ="L2SRAM";
program.sectMap[".myfastsection"].loadSegment ="L2SRAM";

这是否应该与上面的 linker.cmd 相同? 是否也可能(也有必要)对上述不同内核的 L2SRAM 进行分区? 如果我在代码中未使用任何 OMP (即使我使用 RTSC 组件进行编译)、性能也很好。 但是、一旦我在初始函数之后调用的另一个函数中使用 OMP、性能将被暂停。 在 omp_set_num_threads()之后调用初始函数。

我的第二个猜测是 OMP 引入了一些开销。 但是、我不明白为什么初始函数与 OMP 完全无关。 在这里获得一些额外的见解会很有帮助、因为在某些情况下、实际使用 OMP 会非常有用-但在我们的情况下、性能下降是不可接受的。

注意:在第一种情况下、代码仅加载到 core0。 在第二种情况(使用 RTSC 编译、代码中不使用 OMP)和第三种情况(使用 RTSC 编译、在其他函数中使用 OMP)中、代码加载到所有内核上。 在所有情况下都使用相同的优化器标志。 阵列是双字对齐的、在所有情况下都放置在 L2SRAM 中。 在所有情况下、函数都连续调用4次。

如果您需要其他信息、请告诉我。 非常感谢您的参与。

祝你一切顺利、

伊德里斯

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

    您是否检查了存储器映射以确定您基准测试的函数是否分配到您定义的同一存储器区域?
    此外、您配置优先级的任务是否在有/没有 RTSC 的情况下更改?

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

    您好、Garrett、

    请原谅我迟到的回答、并感谢您的回答。 我不得不专注于其他事情。 我会尽快回来。

    祝你一切顺利、

    伊德里斯

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

    好的、Garrett 你是对的、我检查了地图文件、发现不匹配、修复后性能匹配。 请问您还有其他问题吗?

    我了解了 OMP 平台包、其中包含以下内容:

    定制内存映射:[
    ["L2SRAM"、
    {name:"L2SRAM"、基地址:0x00800000、
    Len:0x00060000、访问:"rw"}]、
    ["OMP_MSMC_NC_virt"、
    {name:"OMP_MSMC_NC_virt"、base:0xA0000000、
    Len:0x00020000、访问:"rw"}]、
    ["OMP_MSMC_NC_PHY"、
    {name:"OMP_MSMC_NC_PHY"、base:0x0C000000、
    Len:0x00020000、访问:"rw"}]、
    ["MSMCSRAM"、
    {name:"MSMCSRAM"、base:0x0C020000、
    Len:0x003E0000、access:"rwx"}]、
    ["DDR3"、
    {name:"DDR3"、base:0x8000000、
    Len:0x20000000、access:"rwx"}]、
    ]、
    L2模式:"128k"、
    L1PMode:"32k"、
    L1DMode:"32k"、 

    我在这里有示例 linker.cmd:

    SHRAM: o = 0x0C000000 l = 0x00400000 // 4MB 多核共享内存*/
    
    CORE0_L2_SRAM:O = 0x10800000 l = 0x00080000 // 512KB CORE0 L2/SRAM *
    CORE0_L1P_SRAM:O = 0x10E00000 l = 0x00008000 // 32kB CORE0 L1P/SRAM */
    CORE0_L1D_SRAM:O = 0x10F00000 l = 0x00008000 // 32kB CORE0 L1D/SRAM */ 

    1) 每个内核都有 OMP 平台地址吗?

    2) 我想 l2Mode:"128k"设置128k 高速缓存、这就是为什么在 linker.cmd 中、我的长度为0x00080000、但在前一个中、我的长度为0x00060000?

    3) 在后一种情况下、我可以为不同内核的不同 L2段分配不同的内容。 在 OMP 情况下、我该怎么做?

    4) 在哪个 SPRU*.pdf 中,我可以找到有关平台包中 mem 配置的更多信息?

    非常感谢!

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

    1) 1)地址不是每个内核。
    2)第一种情况设置128K 高速缓存和(512-128)= 384K SRAM (0x60000)、第二种情况将所有512KB (0x80000) L2SRAM 配置为不带高速缓存的 SRAM。
    3) 3)您可以根据内核编号配置缓存/RAM 大小、如下所示:
    coreNum = CSL_chipReadReg (CSL_CHIP_DNUM);
    如果(coreNum =0)
    cache_setL2Size (cache_128KCACHE);
    其他
    (笑声)
    4) 4)您是否在从 CCS -> Project -> RTSC Tools -> Platform -> Edit/View 中查找 ti.runtime.openmp.platforms 的详细信息、 然后浏览到 C:\ti\openmp_dsp _c667x_2_06_03_00\packages as Platform Package Repository (作为平台软件包存储库)、并从 Package Name (软件包名称)下拉列表中选择 omp 平台、以了解器件名称/系列/时钟速度、自定义存储器、高速缓存和存储器部分等的详细信息

    此致、
    Garrett