工具/软件: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次。
如果您需要其他信息、请告诉我。 非常感谢您的参与。
祝你一切顺利、
伊德里斯