• DMA性能测试


        本程序主要用来计算DMA数据读写过程中所花费的总得时间周期,依据公式T=tStart+ceil(L/4)*2+ceil(L/256)*tTransform*2

    因为tTransform是一个常量(通常默认为11),因此只需根据debug文件分析出tStart即可。

         一开始我以为tStart是一个变量,是buffer2-2(读)的开始时刻与准备时刻最后一个buffer2-17(写)的差值,因此写了

    以下程序:

     1 #*************************************************************************
     2 
     3     # File Name: performance_testing.py
     4     # Author: jiangjing
     5     # Mail: jjdl@mail.ustc.edu.cn 
     6     # Created Time: Sat 15 Jul 2017 09:34:04 PM PDT
     7 #************************************************************************
     8 import math
     9 import sys
    10 
    11 def GetFirstBuffer2_2(path):
    12     fDebug=open(path).read() 
    13     index2_2=fDebug.index("[buffer2-2]")
    14     index_space=fDebug.index(" ",index2_2+17)
    15     return [index2_2,fDebug[index2_2+17:index_space]]
    16 
    17 def GetLastBuffer2_17(path,index2_2):
    18     fDebug=open(path).read() 
    19     index2_17=fDebug.rindex("[buffer2-17]",0,index2_2)
    20     index_space=fDebug.index(" ",index2_17+18)
    21     return [index2_17,fDebug[index2_17+18:index_space]]
    22 
    23 def GetTotalTime(L,path,tTransform=11): #the 'path' is the paht of debug file
    24     buffer2_2=GetFirstBuffer2_2(path)
    25     buffer2_17=GetLastBuffer2_17(path,buffer2_2[0])
    26     return int(buffer2_2[1])-int(buffer2_17[1])+math.ceil(L/4)+math.ceil(L/256)*tTransform*2
    27 
    28 #the code just for debug,you can comment the following code
    29 if __name__=='__main__':
    30     if(len(sys.argv)>1):
    31         print(GetTotalTime(int(sys.argv[1]),sys.argv[2]))
    View Code

         但师兄说其实tStart也是一个常量,所以又将程序简化了以下:

     1 #*************************************************************************
     2     # File Name: PerformanceTesting.py
     3     # Author: jiangjing
     4     # Mail: jjdl@mail.ustc.edu.cn 
     5     # Created Time: Sun 16 Jul 2017 06:12:22 AM PDT
     6 #************************************************************************
     7 import math
     8 
     9 tStart=2448
    10 def GetTime(L,tTransform=11):
    11     return tStart+math.ceil(L/4)+math.ceil(L/256)*tTransform*2
    12 
    13 def GetTotalTime(lList):
    14     totalTime=0
    15     for l in lList:
    16         L=l[4]
    17         totalTime+=GetTime(L)
    18     return totalTime
    View Code

        下面的这个test.py为测试样例:

     1 #*************************************************************************
     2     # File Name: test.py
     3     # Author: jiangjing
     4     # Mail: jjdl@mail.ustc.edu.cn 
     5     # Created Time: Sun 16 Jul 2017 06:18:24 AM PDT
     6 #************************************************************************
     7 import PerformanceTesting as PT
     8 
     9 lList=[[0,0,0,0,65555],[0,0,0,0,672323]]
    10 print(PT.GetTotalTime(lList))
    View Code

        考虑到测试的便捷性,师兄建议我采用c语言进行编写。

     一下为C语言版本代码:

     1 #include"stdio.h"
     2 #include"math.h"
     3 #include"conv2_route_plan.c"
     4 #include"route_plan.h"
     5 #define uint32_t unsigned long
     6 
     7 uint32_t tStart=2448;
     8 uint32_t GetTime(uint32_t L){
     9     return tStart+ceil(L/4)*2+ceil(L/256)*11*2;
    10 }
    11 
    12 uint32_t GetTotalTime(route_plan_t lList){
    13     uint32_t totalTime=0;
    14     uint32_t i;
    15     for(i=0;i<lList.num_item;i++)
    16     {
    17         totalTime+=GetTime(lList.route_item_array[i].len);
    18     }
    19     return totalTime;
    20 }
    21 
    22 int main()
    23 {
    24     printf("%d
    ",GetTotalTime(conv2_route_plan));
    25     return 0;
    26 }
    View Code

      其中“route_plan.h“是从师兄的项目中拷下来的,里面定义了输出数据的格式。

     1 #ifndef _ROUTE_PLAN_H_
     2 #define _ROUTE_PLAN_H_
     3 
     4 #include <stdint.h>
     5 
     6 typedef struct {
     7   uint32_t src_buffer_id;
     8   uint32_t src_buffer_offset;
     9   uint32_t dest_buffer_id;
    10   uint32_t dest_buffer_offset;
    11   size_t   len;
    12 } route_item_t;
    13 
    14 typedef struct {
    15   uint32_t num_item;
    16   route_item_t* route_item_array;
    17 } route_plan_t;
    18 #endif // #ifndef _ROUTE_PLAN_H_
    View Code

      其中“conv2_route_plan.c”文件是main.py文件运行输出的结果之一,里面包含了计算计算clock必要的数据。通过改变dsp的数目,本文件中的数据也会发生变化。

    以下是dsp=32时的数据情况:

    #include "route_plan.h"
    
    route_item_t conv2_route_item_array[] = {
      {0, 0.0, 32, 57856.0, 404992.0},
      {1, 0.0, 32, 462848.0, 57856.0},
      {0, 347136.0, 33, 0.0, 57856.0},
      {1, 0.0, 33, 57856.0, 404992.0},
      {2, 0.0, 33, 462848.0, 57856.0},
      {1, 347136.0, 34, 0.0, 57856.0},
      {2, 0.0, 34, 57856.0, 404992.0},
      {3, 0.0, 34, 462848.0, 57856.0},
      {2, 347136.0, 35, 0.0, 57856.0},
      {3, 0.0, 35, 57856.0, 404992.0},
      {4, 0.0, 35, 462848.0, 57856.0},
      {3, 347136.0, 36, 0.0, 57856.0},
      {4, 0.0, 36, 57856.0, 404992.0},
      {5, 0.0, 36, 462848.0, 57856.0},
      {4, 347136.0, 37, 0.0, 57856.0},
      {5, 0.0, 37, 57856.0, 404992.0},
      {6, 0.0, 37, 462848.0, 57856.0},
      {5, 347136.0, 38, 0.0, 57856.0},
      {6, 0.0, 38, 57856.0, 404992.0},
      {7, 0.0, 38, 462848.0, 57856.0},
      {6, 347136.0, 39, 0.0, 57856.0},
      {7, 0.0, 39, 57856.0, 404992.0},
      {8, 0.0, 39, 462848.0, 57856.0},
      {7, 347136.0, 40, 0.0, 57856.0},
      {8, 0.0, 40, 57856.0, 404992.0},
      {9, 0.0, 40, 462848.0, 57856.0},
      {8, 347136.0, 41, 0.0, 57856.0},
      {9, 0.0, 41, 57856.0, 404992.0},
      {10, 0.0, 41, 462848.0, 57856.0},
      {9, 347136.0, 42, 0.0, 57856.0},
      {10, 0.0, 42, 57856.0, 404992.0},
      {11, 0.0, 42, 462848.0, 57856.0},
      {10, 347136.0, 43, 0.0, 57856.0},
      {11, 0.0, 43, 57856.0, 404992.0},
      {12, 0.0, 43, 462848.0, 57856.0},
      {11, 347136.0, 44, 0.0, 57856.0},
      {12, 0.0, 44, 57856.0, 404992.0},
      {13, 0.0, 44, 462848.0, 57856.0},
      {12, 347136.0, 45, 0.0, 57856.0},
      {13, 0.0, 45, 57856.0, 404992.0},
      {14, 0.0, 45, 462848.0, 57856.0},
      {13, 347136.0, 46, 0.0, 57856.0},
      {14, 0.0, 46, 57856.0, 404992.0},
      {15, 0.0, 46, 462848.0, 57856.0},
      {14, 347136.0, 47, 0.0, 57856.0},
      {15, 0.0, 47, 57856.0, 404992.0},
      {16, 0.0, 47, 462848.0, 57856.0},
      {15, 347136.0, 48, 0.0, 57856.0},
      {16, 0.0, 48, 57856.0, 404992.0},
      {17, 0.0, 48, 462848.0, 57856.0},
      {16, 347136.0, 49, 0.0, 57856.0},
      {17, 0.0, 49, 57856.0, 404992.0},
      {18, 0.0, 49, 462848.0, 57856.0},
      {17, 347136.0, 50, 0.0, 57856.0},
      {18, 0.0, 50, 57856.0, 404992.0},
      {19, 0.0, 50, 462848.0, 57856.0},
      {18, 347136.0, 51, 0.0, 57856.0},
      {19, 0.0, 51, 57856.0, 404992.0},
      {20, 0.0, 51, 462848.0, 57856.0},
      {19, 347136.0, 52, 0.0, 57856.0},
      {20, 0.0, 52, 57856.0, 404992.0},
      {21, 0.0, 52, 462848.0, 57856.0},
      {20, 347136.0, 53, 0.0, 57856.0},
      {21, 0.0, 53, 57856.0, 404992.0},
      {22, 0.0, 53, 462848.0, 57856.0},
      {21, 347136.0, 54, 0.0, 57856.0},
      {22, 0.0, 54, 57856.0, 404992.0},
      {23, 0.0, 54, 462848.0, 57856.0},
      {22, 347136.0, 55, 0.0, 57856.0},
      {23, 0.0, 55, 57856.0, 404992.0},
      {24, 0.0, 55, 462848.0, 57856.0},
      {23, 347136.0, 56, 0.0, 57856.0},
      {24, 0.0, 56, 57856.0, 404992.0},
      {25, 0.0, 56, 462848.0, 57856.0},
      {24, 347136.0, 57, 0.0, 57856.0},
      {25, 0.0, 57, 57856.0, 404992.0},
      {26, 0.0, 57, 462848.0, 57856.0},
      {25, 347136.0, 58, 0.0, 57856.0},
      {26, 0.0, 58, 57856.0, 404992.0},
      {27, 0.0, 58, 462848.0, 57856.0},
      {26, 347136.0, 59, 0.0, 57856.0},
      {27, 0.0, 59, 57856.0, 404992.0},
      {28, 0.0, 59, 462848.0, 57856.0},
      {27, 347136.0, 60, 0.0, 57856.0},
      {28, 0.0, 60, 57856.0, 404992.0},
      {29, 0.0, 60, 462848.0, 57856.0},
      {28, 347136.0, 61, 0.0, 57856.0},
      {29, 0.0, 61, 57856.0, 404992.0},
      {30, 0.0, 61, 462848.0, 57856.0},
      {29, 347136.0, 62, 0.0, 57856.0},
      {30, 0.0, 62, 57856.0, 404992.0},
      {31, 0.0, 62, 462848.0, 57856.0},
      {30, 347136.0, 63, 0.0, 57856.0},
      {31, 0.0, 63, 57856.0, 404992.0},
    };
    route_plan_t conv2_route_plan = {
      .num_item = 94,
      .route_item_array = conv2_route_item_array
    };
    View Code

      

    最后的测试结果如下表:

  • 相关阅读:
    git 通过 fork 解决代码冲突
    vue-cli3.0 多页面和单页面的配置以及相互之间的切换
    关于切换环境变量的问题( 以vue-cli3.0 为例)
    vue-router 钩子
    Android eMMC 分区详解(转载)
    《PE总结 》– 重定位表(转载)
    Linux 文件系统
    爬虫登录,立FLAG
    ios tweak 开发
    ios app 砸壳
  • 原文地址:https://www.cnblogs.com/acm-jing/p/7193151.html
Copyright © 2020-2023  润新知