Преглед изворни кода

CMSIS-NN:Added code to be able to benchmark arm_avgpool_s8.
Benchmarking code added into CMSIS-DSP test framework.

Christophe Favergeon пре 6 година
родитељ
комит
97ce6fdff2

+ 1 - 0
CMSIS/DSP/Testing/CMakeLists.txt

@@ -92,6 +92,7 @@ set(TESTSRC testmain.cpp
   Source/FullyConnected.cpp
   Source/FullyConnectedBench.cpp
   Source/Pooling.cpp
+  Source/PoolingBench.cpp
   GeneratedSource/TestDesc.cpp
   )
 

+ 4 - 0
CMSIS/DSP/Testing/FrameworkSource/Timing.cpp

@@ -104,7 +104,11 @@ void cycleMeasurementStart()
 
     SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;  
 
+    while(SysTick->VAL == 0);
+
     startCycles = SysTick->VAL;
+
+
     
 #endif
 

+ 5 - 0
CMSIS/DSP/Testing/FullBenchmark/NN/Pooling/fullBenchmark.csv

@@ -0,0 +1,5 @@
+CATEGORY,NAME,ID,OLDID,NB,CYCLES,OPTIMIZED,HARDFP,FASTMATH,NEON,UNROLL,ROUNDING,PLATFORM,CORE,COMPILER,VERSION
+"NN:Pooling","test_avgpool_s8",1,"",10,87558,1,1,1,0,1,0,FVP,ARMCM7_DP,AC6,6120001
+"NN:Pooling","test_avgpool_s8",1,"",20,177505,1,1,1,0,1,0,FVP,ARMCM7_DP,AC6,6120001
+"NN:Pooling","test_avgpool_s8",1,"",100,885034,1,1,1,0,1,0,FVP,ARMCM7_DP,AC6,6120001
+"NN:Pooling","test_avgpool_s8",1,"",200,1772498,1,1,1,0,1,0,FVP,ARMCM7_DP,AC6,6120001

+ 2 - 0
CMSIS/DSP/Testing/FullBenchmark/NN/Pooling/regression.csv

@@ -0,0 +1,2 @@
+"ID","OLDID","CATEGORY","NAME","OPTIMIZED","HARDFP","FASTMATH","NEON","UNROLL","ROUNDING","PLATFORM","CORE","COMPILER","VERSION","Regression","MAX"
+1,"","NN:Pooling","test_avgpool_s8",1,1,1,0,1,0,"FVP","ARMCM7_DP","AC6",6120001,"-648.9462943071558 + NB * 8864.214500537057",1772498

+ 13 - 0
CMSIS/DSP/Testing/GeneratedInclude/PoolingBench_decl.h

@@ -0,0 +1,13 @@
+void test_avgpool_s8();
+
+// Pattern IDs
+static const int INPUT1_S8_ID=0;
+static const int REF1_S8_ID=1;
+
+// Output IDs
+static const int OUTPUT_S8_ID=0;
+static const int TEMP_S8_ID=1;
+static const int TEMPINPUT_S8_ID=2;
+
+// Test IDs
+static const int TEST_AVGPOOL_S8_1=1;

+ 37 - 0
CMSIS/DSP/Testing/Include/PoolingBench.h

@@ -0,0 +1,37 @@
+#include "Test.h"
+#include "Pattern.h"
+class PoolingBench:public Client::Suite
+    {
+        public:
+            PoolingBench(Testing::testID_t id);
+            void setUp(Testing::testID_t,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr);
+            void tearDown(Testing::testID_t,Client::PatternMgr *mgr);
+        private:
+            #include "PoolingBench_decl.h"
+            
+            Client::Pattern<q7_t> input;
+
+            Client::LocalPattern<q7_t> tmpInput;
+            Client::LocalPattern<q7_t> output;
+            Client::LocalPattern<q15_t> temp;
+
+            // Reference patterns are not loaded when we are in dump mode
+            Client::RefPattern<q7_t> ref;
+
+            int DIM_IN_X;
+            int DIM_IN_Y;
+            int DIM_OUT_X;
+            int DIM_OUT_Y;
+            int IN_CHANNEL;
+            int DIM_FILTER_X;
+            int DIM_FILTER_Y;
+            int PAD_WIDTH;
+            int PAD_HEIGHT;
+            int STRIDE_X;
+            int STRIDE_Y;
+            int ACT_MIN;
+            int ACT_MAX;
+
+            int repeatNb;
+
+    };

+ 85 - 0
CMSIS/DSP/Testing/Source/PoolingBench.cpp

@@ -0,0 +1,85 @@
+#include "PoolingBench.h"
+#include "Error.h"
+#include "arm_nnfunctions.h"
+#include "Test.h"
+
+#include <cstdio>
+
+
+    void PoolingBench::test_avgpool_s8()
+    {
+       q7_t *tmpin = tmpInput.ptr();
+       q7_t *outp = output.ptr();
+       q15_t *tempp = temp.ptr();
+
+      for(int i=0; i < this->repeatNb; i++)
+      {
+       arm_avgpool_s8(
+           DIM_IN_Y,
+           DIM_IN_X,
+           DIM_OUT_Y,
+           DIM_OUT_X,
+           STRIDE_Y,
+           STRIDE_X,
+           DIM_FILTER_Y,
+           DIM_FILTER_X,
+           PAD_HEIGHT,
+           PAD_WIDTH,
+           ACT_MIN,
+           ACT_MAX,
+           IN_CHANNEL,
+           tmpin,
+           tempp,
+           outp);
+       
+       }
+    } 
+
+  
+    void PoolingBench::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr)
+    {
+
+       std::vector<Testing::param_t>::iterator it = paramsArgs.begin();
+       this->repeatNb = *it;
+
+       switch(id)
+       {
+          case PoolingBench::TEST_AVGPOOL_S8_1:
+            input.reload(PoolingBench::INPUT1_S8_ID,mgr);
+            ref.reload(PoolingBench::REF1_S8_ID,mgr);
+
+            this->DIM_IN_X= 4;
+            this->DIM_IN_Y= 2;
+            this->DIM_OUT_X= 2;
+            this->DIM_OUT_Y= 1;
+            this->IN_CHANNEL= 101;
+            this->DIM_FILTER_X= 2;
+            this->DIM_FILTER_Y= 2;
+            this->PAD_WIDTH=  0;
+            this->PAD_HEIGHT= 0;
+            this->STRIDE_X= 2;
+            this->STRIDE_Y= 2;
+            this->ACT_MIN= -128;
+            this->ACT_MAX= 127;
+
+          break; 
+
+
+       }
+       temp.create(this->DIM_OUT_X * this->IN_CHANNEL,PoolingBench::TEMP_S8_ID,mgr);
+
+       output.create(ref.nbSamples(),PoolingBench::OUTPUT_S8_ID,mgr);
+       tmpInput.create(input.nbSamples(),PoolingBench::TEMPINPUT_S8_ID,mgr);
+
+       q7_t *tmpin = tmpInput.ptr();
+       const q7_t *inp = input.ptr();
+
+       memcpy(tmpin,inp,input.nbSamples());
+
+
+    }
+
+    void PoolingBench::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
+    {
+        
+    }

+ 1 - 1
CMSIS/DSP/Testing/addToDB.py

@@ -275,7 +275,7 @@ parser = argparse.ArgumentParser(description='Generate summary benchmarks')
 
 parser.add_argument('-f', nargs='?',type = str, default=None, help="Test description file path")
 parser.add_argument('-b', nargs='?',type = str, default="FullBenchmark", help="Full Benchmark dir path")
-parser.add_argument('-e', action='store_true', help="Embedded test")
+#parser.add_argument('-e', action='store_true', help="Embedded test")
 parser.add_argument('-o', nargs='?',type = str, default="bench.db", help="Benchmark database")
 
 parser.add_argument('others', nargs=argparse.REMAINDER)

BIN
CMSIS/DSP/Testing/bench.db


+ 1 - 1
CMSIS/DSP/Testing/currentConfig.csv

@@ -1,2 +1,2 @@
 OPTIMIZED,HARDFP,FASTMATH,NEON,UNROLL,ROUNDING,PLATFORM,CORE,COMPILER,VERSION
-1,1,1,0,1,0,FVP,ARMCM7_DP,AC6,6120001
+1,1,1,1,1,0,FVP,ARMCA5,AC6,6120001

+ 30 - 3
CMSIS/DSP/Testing/desc.txt

@@ -653,10 +653,10 @@ group Root {
          folder = FullyConnected
 
          ParamList {
-                REPEAT
-                Summary REPEAT
+                NB
+                Summary NB
                 Names "Repetition"
-                Formula "REPEAT"
+                Formula "NB"
             }
 
          Pattern INPUT1_S8_ID : TestCase_1_10_4_input_1.txt
@@ -676,5 +676,32 @@ group Root {
             arm_fully_connected_tflite_s8:test_fully_connected_tflite_s8  -> PARAM1_ID
          }
        }
+
+       suite Pooling Benchmarks {
+         class = PoolingBench 
+         folder = Pooling
+
+         ParamList {
+                NB
+                Summary NB
+                Names "Repetition"
+                Formula "NB"
+          }
+
+         Pattern INPUT1_S8_ID : Input1.txt
+         Pattern REF1_S8_ID : Ref1.txt
+
+         Output  OUTPUT_S8_ID : Output
+         Output  TEMP_S8_ID : Temp
+         Output  TEMPINPUT_S8_ID : TempInput
+
+         Params PARAM1_ID = {
+                NB = [10,20,100,200]
+            }
+
+         Functions {
+            arm_avgpool_s8 Test 1:test_avgpool_s8  -> PARAM1_ID
+         }
+       }
     }
 }

+ 2 - 0
CMSIS/NN/Source/PoolingFunctions/arm_avgpool_s8.c

@@ -56,6 +56,7 @@
    *
    *
    */
+#if defined (ARM_MATH_DSP)
 static void accumulate_q7_to_q15(q15_t * base, q7_t * target, const uint16_t length)
 {
     q15_t    *pCnt = base;
@@ -124,6 +125,7 @@ static void buffer_scale_back_q15_to_q7_and_clamp(q15_t * buffer, q7_t * target,
         target[i] = (q7_t) (sum);
     }
 }
+#endif
 
 void
 arm_avgpool_s8( const int dim_im_in_height,