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.

[参考译文] J784S4XEVM:TI C7000 编译器优化:更改优化编译器标志后未观察到任何变化。

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1636918/j784s4xevm-ti-c7000-compiler-optimizations-no-changes-observed-with-changing-optimization-compiler-flag

器件型号: J784S4XEVM

我正在使用 TI C 7000 测试代码的执行时间。 我要进行基准测试的代码部分由 MATLAB 生成。 我观察到、考虑到其他一切都是相同的变化:  
-- opt_level 从关闭到 4 :没有加速代码执行
–opt_for_speed 从 0 到 4:未加速代码执行
-- fp_mode 从严格到宽松:没有加速代码执行
看到这种执行时间没有差异后、我将代码块替换为下面给出的测试函数:  

1024

//声明一个外部函数以“消耗“矩阵
//阻止编译器优化所有内容
#ifdef _cplusplus
extern “C"{“{
#endif
  空 useMatrix(浮动 MATR[MATRY_SIZE][MATRY_SIZE])
  {
    易失性浮点灌电流= MAT[0][0];
    (void) 水槽;
  }
#ifdef _cplusplus
}
#endif

静态浮点矩阵[MATRY_SIZE][MATRY_SIZE];


int32_t 测试类::: Init ()

  对于 (int i = 0;i < Matrix_size;i++){
    对于 (int j = 0;j < Matrix_size;j++){
      Matrix[i][j]=(浮点)(i + j);
    }
  }

  InitFlag = true;
}

Void TestClass::TestOptimization ()

  // I 递增、j 递减(按请求)
  for (int i = Matrix_size - 1;i >= 0;i-){
    对于 (int j = Matrix_size - 1;j >= 0;j-){
      浮点值= matrix [i][j];

      //一些有助于优化的算术(FMA,流水线等)
      VAL = val * 1.2345f + 0.9876f;
      VAL = val * val - 0.4321f;

      Matrix[i][j]= val;
    }
  }

  //传递到外部函数、因此编译器无法消除它
  useMatrix(矩阵);
}

测量 TestOptimization 函数的执行时间。 对于编译器选项、将-opt_level 从 off 更改为 2 或 4 不会加速执行时间。  
为什么会这样? 您能向我们提供一些可以在代码执行中打开优化、观察和加速的方向吗?  

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

    尊敬的 Ekin:

    您能否告知我们您正在使用哪个 CGT 版本?
    我们将使用提供的测试代码检查是否可以在我们的最终版本中重现此问题、并随时向您发布相关信息。

    此致、

    Betsy Varughese.

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

    您好 Betsy、  

    我将 CGT 版本 5.0.0 LTS 与 Linux SDK 11_01_00_03 和 内核一起使用  6.12. SDK RTOS_11_01_00_04。 这些测试使用无引导模式和 HLOS 模式产生了类似的结果。  

    此外、 我们 目前正在使用 作为我们的数学库、并愿意提供有关更合适的库的任何建议。  

    感谢您的帮助

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

    您好 Betsy、  

    我将 CGT 版本 5.0.0 LTS 与 Linux SDK 11_01_00_03 和 内核一起使用  6.12. SDK RTOS_11_01_00_04。 这些测试使用无引导模式和 HLOS 模式产生了类似的结果。  

    此外、 我们 目前正在使用 作为我们的数学库、并愿意提供有关更合适的库的任何建议。  

    感谢您的帮助

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

    尊敬的 Ekin:

    您能否确认您的计时测量方法(例如,,或 TSC)chronotime.h? 我已经使用了硬件 TSC 用于评估。

    我观察到不同优化级别的周期数不同、并 将矩阵大小减小(减小到 256x256)、以便数据完全适合 L2 SRAM 。 我将分享结果以及下面使用的测试代码:

    e2e.ti.com/.../test_5F00_code.cpp
          

    优化级别  (矩阵初始化)  (内核计算)
    -O0 1,255,677 8,548,401.
    -O1 1,255,670 8,347,168.
    -O2 424,249. 1,822,644.
    -O3 424,257. 2,381,507.
    -O4. 424,324 2,381,451.


    还能分享一下 链接器脚本 完整测试代码 ? 为了进行比较、我当前使用的是中的默认链接器脚本 DSPLIB

    此致、
    Shabary S Sundar

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

    您好 Betsy、

    我们正在 使用 j784s4_linker_freertos.cmd 和 linker_mem_map.cmd 处理 FreeRTOS。

    例如、时序测量方法/app_utils/utils/timer

    Uint64_t appLogGetGlobalTimeInsec (void)

       uint64_t cur_ts = 0; /*在用例中返回 ts */
       if ((0U != GTC_BASE_ADDR) &&
        (0U != mhzFreq)
      {
         CUR_ts = appLogGetGtc () /mhzFreq ;
      }

       返回 cur_ts;
    }


    初始化函数。

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

    尊敬的 Ekin:

    我们正在 使用 j784s4_linker_freertos.cmd 和 linker_mem_map.cmd 开发 FreeRTOS。

    从您的设置来看、问题看起来是内存限制而不是计算限制。 默认情况下、1024×1024 浮点矩阵 (~4MB) 放置在 DDR 中、而 C7x_1 L2 高速缓存只有 64KB。 由于工作集远大于高速缓存、内核可能会将大部分时间花费在 DDR 访问上、因此编译器优化不会产生任何明显的影响。

    您能否请尝试减小矩阵大小以适应 L2 SRAM (448KB)、并将其显式放置在 L2 SRAM 中、然后尝试使用不同的优化级别进行编译。

    此致、
    Shabary S Sundar