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.

[参考译文] Starterware/AM3359:L1添加 L2高速缓存性能问题

Guru**** 2609955 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580169/starterware-am3359-l1-add-l2-cache-performance-problem

器件型号:AM3359

工具/软件:Starterware

您好!

我将 TI staterWare 与 ICE 板配合使用。

使用裸机应用程序在 CCS7中创建了一个项目。在调试我的项目时,它在31个时钟周期内显示以执行单个指令。

我已使用启用 MMU 和高速缓存  

int main (void){

INT 成功= 0;

MMUConfigAndEnable();
CACHEEnable (cache_IDCACHE、cache_inner_outer);
 CACHEEnable (cache_icacHE、cache_inner_outer);

printf ("平台初始化!!! \n");

volatile long a、b、ccount=0;

A=0;

B=0;

for (计数=0;计数<=100;计数++)

{  

a=b+c;

我想知道有关缓存和 MMU 的其他需要做的事情

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Samir、
    我们将对此进行研究、并将返回给您。

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

    Samir、

    您能否尝试对以下代码进行基准测试并让我知道您的编号?

    volatile long A[100];
    
    int main (void){
    
    int Success = 0;
    
    MMUConfigAndEnable ();
    CACHEEnable (cache_IDCACHE、cache_inner_outer);
    CACHEEnable (cache_ICACHE、 cache_inner_exuter);
    
    printf ("平台初始化!!!! \n");
    printf (" long %d\n",sizeof (long));
    
    long b[100]、c[100]、count=0;
    
    
    for (count=0;count <=100;count++)
    {
    a[count]= count;
    
    }
    
    for (count=0;count <=100;count++)
    {
    
    =100;
    
    
    
    
    
    
    count
    = 3+[count};count +;count = 100;
    
    
    
    count}
    
    a[count]=b[count]+c[count];
    
    }
    
    

    我想知道、如果您将某些内容定义为易失性、编译器会在从存储器读取值之前使缓存无效。

    Lali

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lalindra、
    感谢您的回复、但问题相同。没有改进。 指令、如 CMP R3、#0x64需要31个周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Samir、

    您能否在您正在尝试的 CCS 示例项目的主题上发帖? 谢谢。

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

    e2e.ti.com/.../1884.gpio_5F00_test.zip

    您好!
    这是我从 TI Staerware 导入的 GPIO LED 闪烁项目

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

    您好 Samir、

    观察到的31个周期是在汇编指令之间放置硬件断点的结果。 由于工具和流水线开销、这不是一种用于对指令周期计数进行基准测试的好方法。 让我们尝试说明为什么这不是指令的实际周期计数。

    让我们看看您尝试的以下代码示例。 我还基于 Starterware 软件包中的 GPIO 示例。

    int main()
    {
    MMUConfigAndEnable();
    CACHEEnable (cache_IDCACHE、cache_inner_outer);
    CACHEEnable (cache_icacHE、cache_inner_outer);
    
    INT 成功= 0;
    volatile long a、b、c、count = 0;
    A=0;
    B=0;
    
    for (计数=0;计数<=100;计数++)
    {
    a=b+c;
    }
    } 

    针对这种情况的反汇编如下所示:

    在 for 循环前后放置了一个断点。 因此、1515周期计数将针对大约15个周期的100次迭代运行10条指令(在突出显示的行之间)。

    现在、如果将 for 循环增加到100、000次迭代、则周期计数将会下降。 当您继续增加迭代次数时、预计会出现这种情况。

    如果代码中已完全禁用高速缓存、则运行相同100次 for 循环迭代的周期计数将大幅增加到78494。 这表明启用高速缓存确实会影响性能。

    由于流水线和仿真工具开销,设置硬件断点以分析每个指令并不是检查指令效率的可靠方法。 此外、对变量使用 volatile 会进一步降低性能、这是需要记住的另一个因素。

    希望这能澄清。

    Lali