Projekt HaWe brickbench Benchmark Test f. NXT, EV3 & andere CPUs

Allgemeines und oft gestellte Fragen (z.B. Baukästen, Anleitungen, Projekte...)

Moderator: Moderatoren

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test NXT (NXC) vs. EV3 (BCC-C)

Beitragvon Martin0x5E » 17. Dez 2013 19:03

NxtOSEK - Ausführung im RAM, STACKSIZE = 512

0 25 int_Add
1 164 int_Mult
2 430 float_op
3 55 rand_arr
4 39 matrix_al
5 440 arr_sort
6 16 disp_txt
7 161 grafics

Was sofort auffällt ist, dass "integer multiply/division" und "randomize Mersenne T." weit über den erwarteten Werten liegen?
Hier meine Frage an dich: Was wurde hier geändert, was den Prozessor so in die Knie zwingt? Ich vermute hier ein Problem mit "volatile".

Was besser ist als erwartet sind 0, 2, 4, 5 die durchschnitt nur 4,3 mal schlechter sind als der EV3. Erwartetes Prozessor-Verhältnis 300/48 = 6,25.
Wahrscheinlich liegt das daran das beim EV3 eine VM läuft. Dem entgegenzusetzen währe natürlich das beim EV3 dafür kein Sheduler für die Echtzeitfähigkeit des Systems läuft. (Keine Möglichkeit für Echtzeit-Tasks)

Display Ausgaben sind in nxtOSEK sehr direkt implementiert und daher sehr schnell. Ein direkter Vergleich zum EV3 ist hier zu diesem Zeitpunkt wohl noch nicht möglich da man die Implementationen/Hardware schwer vergleichen kann.
Grafik ausgaben sind von mir selbst in nxtOSEK implementiert worden. Der Header-Drawer-Define wurde natürlich auf Optimierung für Geschwindigkeit gestellt. ;)

Test-Code:

Code: Alles auswählen

/**
 * nxtOsek TOPPERS/ATK C/C++
 * Credits to HaWe-bench by Helmut Wunder
 * Porting to nxtOSEK: Martin Aumair
 * Author: http://roboticsaumair.jimdo.com/
 * License: GNU GPL on all Files
 *
 * See also:
 * http://sourceforge.net/apps/phpbb/mindboards/viewtopic.php?f=3&t=2035&start=0
 * http://www.mindstormsforum.de/viewtopic.php?p=63607#p63607
 */


extern "C" {

#include "C:/cygwin/nxtOSEK/toppers_osek/include/kernel.h"
#include "kernel_id.h"
#include "C:/cygwin/nxtOSEK/ecrobot/c/ecrobot_interface.h"


//DeclareResource(ostreamRes);
DeclareTask(TaskMain);
DeclareEvent(EventSleep);
DeclareEvent(EventSleepI2C);
DeclareCounter(SysTimerCnt);

} // extern C

#include <cmath>;
#include <cstdio>;
#include "convert.hpp"

#include "LcdDrawer.hpp"
NLcd lcd; // pixel drawer

/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////OSEK HOOKS/IRS///////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

extern "C" {

// nxtOSEK hook to be invoked from an ISR in category 2
void user_1ms_isr_type2(void) {
   //SleeperMonitor();
   StatusType ercd;

   ercd = SignalCounter(SysTimerCnt); /* Increment OSEK Alarm Counter */
   if (ercd != E_OK) {
       ShutdownOS(ercd);
   }
}

// hooks
void ecrobot_device_initialize(void);
void ecrobot_device_terminate(void);



/////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////BENCHMARK FUNCTIONS////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////


int a[500], b[500], c[500];


//--------------------------------------------
// Mersenne Twister
//--------------------------------------------

unsigned long randM(void) {
   const int M = 7;
   const unsigned long A[2] = { 0, 0x8ebfd028 };

   static unsigned long y[25];
   static int index = 25 + 1;

   if (index >= 25) {
      int k;
      if (index > 25) {
         unsigned long r = 9, s = 3402;
         for (k = 0; k < 25; ++k) {
            r = 509845221 * r + 3;
            s *= s + 1;
            y[k] = s + (r >> 10);
         }
      }
      for (k = 0; k < 25 - M; ++k)
         y[k] = y[k + M] ^ (y[k] >> 1) ^ A[y[k] & 1];
      for (; k < 25; ++k)
         y[k] = y[k + (M - 25)] ^ (y[k] >> 1) ^ A[y[k] & 1];
      index = 0;
   }

   unsigned long e = y[index++];
   e ^= (e << 7) & 0x2b5b2500;
   e ^= (e << 15) & 0xdb8b0000;
   e ^= (e >> 16);
   return e;
}


void MatrixMatrixMult(int N, int M, int K, float A[][2], float B[][2], float C[][2]) {
   int i, j, s;
   for (i = 0; i < N; ++i) {
      for (j = 0; j < K; ++j) {
         C[i][j] = 0;
         for (s = 0; s < M; ++s) {
            C[i][j] = C[i][j] + A[i][s] * B[s][j];
         }
      }
   }
}



// no VLA!
float MatrixDet(int N, float A[]) {
   int i, j, i_count, j_count, count = 0;
   float Asub[N - 1][N - 1], det = 0;

   if (N == 1)
      return *A;
   if (N == 2)
      return ((*A) * (*(A+1+1*N)) - (*(A+1*N)) * (*(A+1)));

   for (count = 0; count < N; count++) {
      i_count = 0;
      for (i = 1; i < N; i++) {
         j_count = 0;
         for (j = 0; j < N; j++) {
            if (j == count)
               continue;
            Asub[i_count][j_count] = *(A+i+j*N);
            j_count++;
         }
         i_count++;
      }
      det += pow(-1, count) * A[0+count*N] * MatrixDet(N - 1, &Asub[0][0]);
   }
   return det;
}


//--------------------------------------------
// shell sort
//--------------------------------------------

void shellsort0(int size, int *array) {
   int iter, jter, inc, temp, i, j;
   for (inc = size / 2; inc > 0; inc /= 2) {
      for (i = inc; i < size; i++) {
         temp = array[i];
         for (j = i; j >= inc; j -= inc) {
            if (temp < array[j - inc]) {
               array[j] = array[j - inc];
            } else {
               break;
            }
         }
         array[j] = temp;
      }
   }
}

void shellsort(int size, int* A)
{
  int i, j, increment;
  int temp;
  increment = size / 2;

  while (increment > 0) {
    for (i = increment; i < size; i++) {
      j = i;
      temp = A[i];
      while ((j >= increment) && (A[j-increment] > temp)) {
        A[j] = A[j - increment];
        j = j - increment;
      }
      A[j] = temp;
    }

    if (increment == 2)
       increment = 1;
    else
       increment = (unsigned int) (increment / 2.2);
  }
}


//--------------------------------------------
// benchmark test procedures
//--------------------------------------------

int test_Int_Add() {
   int i=1, j=11, k=112, l=1111, m=11111, n=-1, o=-11, p=-111, q=-1112, r=-11111;
   int x;
   volatile long s=0;
   for(x=0;x<10000;++x) {
     s+=i; s+=j; s+=k; s+=l; s+=m; s+=n; s+=o; s+=p; s+=q; s+=r;
   }
   return s;
}



long test_Int_Mult() {

  volatile long s;
  int i, x, y;
  for(y=0;y<2000;++y) {
    i=1;
    s=1;
    for(x=0;x<13;++x) { s=s*i++;}
    i--;
    for(x=0;x<13;++x) { s=s/i--;}

  }
  return s;
}


float test_float_math() {
   float s = M_PI;
   int y;

   for (y = 0; y < 10000; ++y) {
      s *= sqrt(s);
      s = sin(s);
      s *= cos(10.5 * s);
      s = sqrt(s);
      s = exp(s);
   }
   return s;
}


long test_rand_MT() {
   volatile unsigned long s;
   int y;

   for (y = 0; y < 5000; ++y) {
      s = randM() % 10001;
   }
   return s;
}

float test_matrix_math() {
   int x;

   float A[2][2], B[2][2], C[2][2];
   float O[3][3], T[3][3];
   unsigned long s;

   for (x = 0; x < 250; ++x) {

      A[0][0] = 1;
      A[0][1] = 3;
      A[1][0] = 2;
      A[1][1] = 4;

      B[0][0] = 10;
      B[0][1] = 30;
      B[1][0] = 20;
      B[1][1] = 40;

      MatrixMatrixMult(2, 2, 2, A, B, C);

      A[0][0] = 1;
      A[0][1] = 3;
      A[1][0] = 2;
      A[1][1] = 4;

      MatrixDet(2, &A[0][0]);

      O[0][0] = 1;
      O[0][1] = 4;
      O[0][2] = 7;
      O[1][0] = 2;
      O[1][1] = 5;
      O[1][2] = 8;
      O[2][0] = 3;
      O[2][1] = 6;
      O[2][2] = 9;

      MatrixDet(3, &O[0][0]);

   }

   s = (O[0][0] * O[1][1] * O[2][2]);
   return s;
}


long test_Sort(){
  int y;

  for(y=0;y<50;++y) {
    shellsort(500, a);
    shellsort(500, b);
    shellsort(500, c);
  }

  return y;
}


// helper functions for output
// normally with cout our sprintf but I think in a benchmark we take the fastest method
void NumOut(int x, int y, int num, U32 places) {
   display_goto_xy(x, y);
   display_int(num, places);
}

void TextOut(int x, int y, const char *str) {
   display_goto_xy(x, y);
   display_string(str);
}

long test_TextOut() {
   int y;

   for (y = 0; y < 20; ++y) {
      display_clear(0);

      // x,y value is line not pixel! nxtOSEK use fast dma update in chars,lines!
      NumOut(0,0, 0, 1); NumOut(2,0, 1000, 4); TextOut(8,0, "int_Add");
      NumOut(0,1, 1, 1); NumOut(2,1, 1010, 4); TextOut(8,1, "int_Mult");
      NumOut(0,2, 2, 1); NumOut(2,2, 1020, 4); TextOut(8,2, "float_op");
      NumOut(0,3, 3, 1); NumOut(2,3, 1030, 4); TextOut(8,3, "rand_array");
      NumOut(0,4, 4, 1); NumOut(2,4, 1040, 4); TextOut(8,4, "matrx_algb");
      NumOut(0,5, 5, 1); NumOut(2,5, 1050, 4); TextOut(8,5, "arr_sort");
      NumOut(0,6, 6, 1); NumOut(2,6, 1060, 4); TextOut(8,6, "displ_txt");
      NumOut(0,7, 7, 1); NumOut(2,7, 1070, 4); TextOut(8,7, "testing...");
      display_update();  // not really good because we can update hardware only every 16 ms
   }
   return 99;
}


long test_graphics() {
   int x = 0;
   for (int y = 0; y < 100; ++y) {
      display_clear(0);

      // no official functions, its my actual project: NXtpandedLib
      Drawer::drawCircle(lcd, 50, 40, 10, DrawOpt::draw());
      Drawer::drawCircleFilled(lcd, 30, 24, 10, DrawOpt::draw());
      Drawer::drawLine(lcd, 10, 10, 60, 60, DrawOpt::draw());
      Drawer::drawLine(lcd, 50, 20, 90, 70, DrawOpt::draw());
      Drawer::drawRectangle(lcd, 20, 20, 40, 40, DrawOpt::draw());
      Drawer::drawRectangleFilled(lcd, 65, 25, 20, 30, DrawOpt::draw());
      Drawer::drawEllipse(lcd, 70, 30, 15, 20, DrawOpt::draw());

      display_update(); // not really good because we can update hardware only every 16 ms
   }
   return x;
}



U32 runtime[8];

void displayValues() {
   display_clear(0);

   NumOut(0,0, 0, 1); NumOut(2,0, (int)runtime[0], 5); TextOut(8,0, "int_Add");
   NumOut(0,1, 1, 1); NumOut(2,1, (int)runtime[1], 5); TextOut(8,1, "int_Mult");
   NumOut(0,2, 2, 1); NumOut(2,2, (int)runtime[2], 5); TextOut(8,2, "float_op");
   NumOut(0,3, 3, 1); NumOut(2,3, (int)runtime[3], 5); TextOut(8,3, "rand_array");
   NumOut(0,4, 4, 1); NumOut(2,4, (int)runtime[4], 5); TextOut(8,4, "matrx_algb");
   NumOut(0,5, 5, 1); NumOut(2,5, (int)runtime[5], 5); TextOut(8,5, "arr_sort");
   NumOut(0,6, 6, 1); NumOut(2,6, (int)runtime[6], 5); TextOut(8,6, "displ_txt");
   NumOut(0,7, 7, 1); NumOut(2,7, (int)runtime[7], 5); TextOut(8,7, "grafics");
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////TASKS ///////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////


TASK(TaskMain) {
   //test_graphics();
   //display_update();


   unsigned long time0, x, y;
   float s;

   display_clear(1);

   TextOut(0, 0, "HaWe_Bench");
   TextOut(0, 1, "(C)H.Wunder 2013");
   TextOut(0, 3, "nxtOSEK port:");
   TextOut(0, 4, "Martin Aumair");
   TextOut(0, 5, "initializing...");
   display_update();
   systick_wait_ms(3000);

   for (y = 0; y < 500; ++y) {
      a[y] = randM();
      b[y] = randM();
      c[y] = randM();
   }

   TextOut(0, 6, "done .. go!");
   display_update();
   systick_wait_ms(2000);
   display_clear(1);

   time0 = systick_get_ms();
   s = test_Int_Add();
   runtime[0] = systick_get_ms() - time0;
   NumOut(0,0, 0, 1); NumOut(2,0, (int)runtime[0], 5); TextOut(8,0, "int_Add");
   display_update();

   time0 = systick_get_ms();
   s = test_Int_Mult();
   runtime[1] = systick_get_ms() - time0;
   NumOut(0,1, 1, 1); NumOut(2,1, (int)runtime[1], 5); TextOut(8,1, "int_Mult");
   display_update();

   time0 = systick_get_ms();
   s = test_float_math();
   runtime[2] = systick_get_ms() - time0;
   NumOut(0,2, 2, 1); NumOut(2,2, (int)runtime[2], 5); TextOut(8,2, "float_op");
   display_update();

   time0 = systick_get_ms();
   s = test_rand_MT();
   runtime[3] = systick_get_ms() - time0;
   NumOut(0,3, 3, 1); NumOut(2,3, (int)runtime[3], 5); TextOut(8,3, "rand_array");
   display_update();

   time0 = systick_get_ms();
   s = test_matrix_math();
   runtime[4] = systick_get_ms() - time0;
   NumOut(0,4, 4, 1); NumOut(2,4, (int)runtime[4], 5); TextOut(8,4, "matrx_algb");
   display_update();

   time0 = systick_get_ms();
   s = test_Sort();
   runtime[5] = systick_get_ms() - time0;
   NumOut(0,5, 5, 1); NumOut(2,5, (int)runtime[5], 5); TextOut(8,5, "arr_sort");
   display_update();

   time0 = systick_get_ms();
   s = test_TextOut();
   runtime[6] = systick_get_ms() - time0;
   display_update();


   time0 = systick_get_ms();
   s = test_graphics();
   runtime[7] = systick_get_ms() - time0;

   displayValues();

   systick_wait_ms(10000);
   display_clear(1);
   y = 0;
   for (x = 0; x < 8; ++x) {
      y += runtime[x];
   }

   TextOut(0,0, "sum ms:");    NumOut(8,0, y, 7);
   TextOut(0,1, "benchmark:"); NumOut(8,1, 50000000/y, 7);

   TerminateTask();
}

}

Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 17. Dez 2013 19:20

NxtOSEK - NXT-BIOS: RAM+ROM , STACKSIZE = 512

0 30 int_Add
1 165 int_Mult
2 645 float_op
3 65 rand_arr
4 58 matrix_al
5 506 arr_sort
6 17 disp_txt
7 188 grafics

Gesamt MS: 1694
Benchmark: 29515

Um x1.27 langsamer.

Die Benutzung vom ganzen möglichen Speicher des NXT scheint alles etwas langsamer zu machen. Ich vermute das der Zugriff auf den größeren Speicher längere Zeiten in Anspruch nimmt oder das der ROM einfach normal langsamer ist. Währe super wenn irgendwer dafür ne Erklärung hätte.
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 17. Dez 2013 19:26

wie ist jetzt der komplette hwbench-Code?
nenn die Version mal bitte
ver. 1.00

:)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 17. Dez 2013 19:48

Float läuft jetzt mit 215 ms in der nur RAM - Version. Bitte bei Bios Version einfach zurückrechnen. Keine Lust jetzt schon wieder die Firmware zu wechseln.

Code: Alles auswählen

/**
 * nxtOsek TOPPERS/ATK C/C++
 * hw brickbench v1.00
 * Credits to HaWe-bench by Helmut Wunder
 * Porting to nxtOSEK: Martin Aumair
 * Author: http://roboticsaumair.jimdo.com/
 * License: GNU GPL on all Files
 *
 *
 * See also:
 * http://sourceforge.net/apps/phpbb/mindboards/viewtopic.php?f=3&t=2035&start=0
 * http://www.mindstormsforum.de/viewtopic.php?p=63607#p63607
 */


extern "C" {

#include "C:/cygwin/nxtOSEK/toppers_osek/include/kernel.h"
#include "kernel_id.h"
#include "C:/cygwin/nxtOSEK/ecrobot/c/ecrobot_interface.h"


//DeclareResource(ostreamRes);
DeclareTask(TaskMain);
DeclareEvent(EventSleep);
DeclareEvent(EventSleepI2C);
DeclareCounter(SysTimerCnt);

} // extern C

#include <cmath>;
#include <cstdio>;
#include "convert.hpp"

#include "LcdDrawer.hpp"
NLcd lcd; // pixel drawer

/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////OSEK HOOKS/IRS///////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

extern "C" {

// nxtOSEK hook to be invoked from an ISR in category 2
void user_1ms_isr_type2(void) {
   //SleeperMonitor();
   StatusType ercd;

   ercd = SignalCounter(SysTimerCnt); /* Increment OSEK Alarm Counter */
   if (ercd != E_OK) {
       ShutdownOS(ercd);
   }
}

// hooks
void ecrobot_device_initialize(void);
void ecrobot_device_terminate(void);



/////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////BENCHMARK FUNCTIONS////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////


int a[500], b[500], c[500];


//--------------------------------------------
// Mersenne Twister
//--------------------------------------------

unsigned long randM(void) {
   const int M = 7;
   const unsigned long A[2] = { 0, 0x8ebfd028 };

   static unsigned long y[25];
   static int index = 25 + 1;

   if (index >= 25) {
      int k;
      if (index > 25) {
         unsigned long r = 9, s = 3402;
         for (k = 0; k < 25; ++k) {
            r = 509845221 * r + 3;
            s *= s + 1;
            y[k] = s + (r >> 10);
         }
      }
      for (k = 0; k < 25 - M; ++k)
         y[k] = y[k + M] ^ (y[k] >> 1) ^ A[y[k] & 1];
      for (; k < 25; ++k)
         y[k] = y[k + (M - 25)] ^ (y[k] >> 1) ^ A[y[k] & 1];
      index = 0;
   }

   unsigned long e = y[index++];
   e ^= (e << 7) & 0x2b5b2500;
   e ^= (e << 15) & 0xdb8b0000;
   e ^= (e >> 16);
   return e;
}


void MatrixMatrixMult(int N, int M, int K, float A[][2], float B[][2], float C[][2]) {
   int i, j, s;
   for (i = 0; i < N; ++i) {
      for (j = 0; j < K; ++j) {
         C[i][j] = 0;
         for (s = 0; s < M; ++s) {
            C[i][j] = C[i][j] + A[i][s] * B[s][j];
         }
      }
   }
}



// no VLA!
float MatrixDet(int N, float A[]) {
   int i, j, i_count, j_count, count = 0;
   float Asub[N - 1][N - 1], det = 0;

   if (N == 1)
      return *A;
   if (N == 2)
      return ((*A) * (*(A+1+1*N)) - (*(A+1*N)) * (*(A+1)));

   for (count = 0; count < N; count++) {
      i_count = 0;
      for (i = 1; i < N; i++) {
         j_count = 0;
         for (j = 0; j < N; j++) {
            if (j == count)
               continue;
            Asub[i_count][j_count] = *(A+i+j*N);
            j_count++;
         }
         i_count++;
      }
      det += pow(-1, count) * A[0+count*N] * MatrixDet(N - 1, &Asub[0][0]);
   }
   return det;
}


//--------------------------------------------
// shell sort
//--------------------------------------------

void shellsort0(int size, int *array) {
   int iter, jter, inc, temp, i, j;
   for (inc = size / 2; inc > 0; inc /= 2) {
      for (i = inc; i < size; i++) {
         temp = array[i];
         for (j = i; j >= inc; j -= inc) {
            if (temp < array[j - inc]) {
               array[j] = array[j - inc];
            } else {
               break;
            }
         }
         array[j] = temp;
      }
   }
}

void shellsort(int size, int* A)
{
  int i, j, increment;
  int temp;
  increment = size / 2;

  while (increment > 0) {
    for (i = increment; i < size; i++) {
      j = i;
      temp = A[i];
      while ((j >= increment) && (A[j-increment] > temp)) {
        A[j] = A[j - increment];
        j = j - increment;
      }
      A[j] = temp;
    }

    if (increment == 2)
       increment = 1;
    else
       increment = (unsigned int) (increment / 2.2);
  }
}


//--------------------------------------------
// benchmark test procedures
//--------------------------------------------

int test_Int_Add() {
   int i=1, j=11, k=112, l=1111, m=11111, n=-1, o=-11, p=-111, q=-1112, r=-11111;
   int x;
   volatile long s=0;
   for(x=0;x<10000;++x) {
     s+=i; s+=j; s+=k; s+=l; s+=m; s+=n; s+=o; s+=p; s+=q; s+=r;
   }
   return s;
}



long test_Int_Mult() {

  volatile long s;
  int i, x, y;
  for(y=0;y<2000;++y) {
    i=1;
    s=1;
    for(x=0;x<13;++x) { s=s*i++;}
    i--;
    for(x=0;x<13;++x) { s=s/i--;}

  }
  return s;
}


float test_float_math() {
   float s = M_PI;
   int y;

   for (y = 0; y < 5000; ++y) {
      s *= sqrt(s);
      s = sin(s);
      s *= cos(10.5 * s);
      s = sqrt(s);
      s = exp(s);
   }
   return s;
}


long test_rand_MT() {
   volatile unsigned long s;
   int y;

   for (y = 0; y < 5000; ++y) {
      s = randM() % 10001;
   }
   return s;
}

float test_matrix_math() {
   int x;

   float A[2][2], B[2][2], C[2][2];
   float O[3][3], T[3][3];
   unsigned long s;

   for (x = 0; x < 250; ++x) {

      A[0][0] = 1;
      A[0][1] = 3;
      A[1][0] = 2;
      A[1][1] = 4;

      B[0][0] = 10;
      B[0][1] = 30;
      B[1][0] = 20;
      B[1][1] = 40;

      MatrixMatrixMult(2, 2, 2, A, B, C);

      A[0][0] = 1;
      A[0][1] = 3;
      A[1][0] = 2;
      A[1][1] = 4;

      MatrixDet(2, &A[0][0]);

      O[0][0] = 1;
      O[0][1] = 4;
      O[0][2] = 7;
      O[1][0] = 2;
      O[1][1] = 5;
      O[1][2] = 8;
      O[2][0] = 3;
      O[2][1] = 6;
      O[2][2] = 9;

      MatrixDet(3, &O[0][0]);

   }

   s = (O[0][0] * O[1][1] * O[2][2]);
   return s;
}


long test_Sort(){
  int y;

  for(y=0;y<50;++y) {
    shellsort(500, a);
    shellsort(500, b);
    shellsort(500, c);
  }

  return y;
}


// helper functions for output
// normally with cout our sprintf but I think in a benchmark we take the fastest method
void NumOut(int x, int y, int num, U32 places) {
   display_goto_xy(x, y);
   display_int(num, places);
}

void TextOut(int x, int y, const char *str) {
   display_goto_xy(x, y);
   display_string(str);
}

long test_TextOut() {
   int y;

   for (y = 0; y < 20; ++y) {
      display_clear(0);

      // x,y value is line not pixel! nxtOSEK use fast dma update in chars,lines!
      NumOut(0,0, 0, 1); NumOut(2,0, 1000, 4); TextOut(8,0, "int_Add");
      NumOut(0,1, 1, 1); NumOut(2,1, 1010, 4); TextOut(8,1, "int_Mult");
      NumOut(0,2, 2, 1); NumOut(2,2, 1020, 4); TextOut(8,2, "float_op");
      NumOut(0,3, 3, 1); NumOut(2,3, 1030, 4); TextOut(8,3, "rand_array");
      NumOut(0,4, 4, 1); NumOut(2,4, 1040, 4); TextOut(8,4, "matrx_algb");
      NumOut(0,5, 5, 1); NumOut(2,5, 1050, 4); TextOut(8,5, "arr_sort");
      NumOut(0,6, 6, 1); NumOut(2,6, 1060, 4); TextOut(8,6, "displ_txt");
      NumOut(0,7, 7, 1); NumOut(2,7, 1070, 4); TextOut(8,7, "testing...");
      display_update();  // not really good because we can update hardware only every 16 ms
   }
   return 99;
}


long test_graphics() {
   int x = 0;
   for (int y = 0; y < 100; ++y) {
      display_clear(0);

      // no official functions, its my actual project: NXtpandedLib
      Drawer::drawCircle(lcd, 50, 40, 10, DrawOpt::draw());
      Drawer::drawCircleFilled(lcd, 30, 24, 10, DrawOpt::draw());
      Drawer::drawLine(lcd, 10, 10, 60, 60, DrawOpt::draw());
      Drawer::drawLine(lcd, 50, 20, 90, 70, DrawOpt::draw());
      Drawer::drawRectangle(lcd, 20, 20, 40, 40, DrawOpt::draw());
      Drawer::drawRectangleFilled(lcd, 65, 25, 20, 30, DrawOpt::draw());
      Drawer::drawEllipse(lcd, 70, 30, 15, 20, DrawOpt::draw());

      display_update(); // not really good because we can update hardware only every 16 ms
   }
   return x;
}



U32 runtime[8];

void displayValues() {
   display_clear(0);

   NumOut(0,0, 0, 1); NumOut(2,0, (int)runtime[0], 5); TextOut(8,0, "int_Add");
   NumOut(0,1, 1, 1); NumOut(2,1, (int)runtime[1], 5); TextOut(8,1, "int_Mult");
   NumOut(0,2, 2, 1); NumOut(2,2, (int)runtime[2], 5); TextOut(8,2, "float_op");
   NumOut(0,3, 3, 1); NumOut(2,3, (int)runtime[3], 5); TextOut(8,3, "rand_array");
   NumOut(0,4, 4, 1); NumOut(2,4, (int)runtime[4], 5); TextOut(8,4, "matrx_algb");
   NumOut(0,5, 5, 1); NumOut(2,5, (int)runtime[5], 5); TextOut(8,5, "arr_sort");
   NumOut(0,6, 6, 1); NumOut(2,6, (int)runtime[6], 5); TextOut(8,6, "displ_txt");
   NumOut(0,7, 7, 1); NumOut(2,7, (int)runtime[7], 5); TextOut(8,7, "grafics");
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////TASKS ///////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////


TASK(TaskMain) {
   //test_graphics();
   //display_update();


   unsigned long time0, x, y;
   float s;

   display_clear(1);

   TextOut(0, 0, "HaWe_Bench");
   TextOut(0, 1, "(C)H.Wunder 2013");
   TextOut(0, 3, "nxtOSEK port:");
   TextOut(0, 4, "Martin Aumair");
   TextOut(0, 5, "initializing...");
   display_update();
   systick_wait_ms(3000);

   for (y = 0; y < 500; ++y) {
      a[y] = randM();
      b[y] = randM();
      c[y] = randM();
   }

   TextOut(0, 6, "done .. go!");
   display_update();
   systick_wait_ms(2000);
   display_clear(1);

   time0 = systick_get_ms();
   s = test_Int_Add();
   runtime[0] = systick_get_ms() - time0;
   NumOut(0,0, 0, 1); NumOut(2,0, (int)runtime[0], 5); TextOut(8,0, "int_Add");
   display_update();

   time0 = systick_get_ms();
   s = test_Int_Mult();
   runtime[1] = systick_get_ms() - time0;
   NumOut(0,1, 1, 1); NumOut(2,1, (int)runtime[1], 5); TextOut(8,1, "int_Mult");
   display_update();

   time0 = systick_get_ms();
   s = test_float_math();
   runtime[2] = systick_get_ms() - time0;
   NumOut(0,2, 2, 1); NumOut(2,2, (int)runtime[2], 5); TextOut(8,2, "float_op");
   display_update();

   time0 = systick_get_ms();
   s = test_rand_MT();
   runtime[3] = systick_get_ms() - time0;
   NumOut(0,3, 3, 1); NumOut(2,3, (int)runtime[3], 5); TextOut(8,3, "rand_array");
   display_update();

   time0 = systick_get_ms();
   s = test_matrix_math();
   runtime[4] = systick_get_ms() - time0;
   NumOut(0,4, 4, 1); NumOut(2,4, (int)runtime[4], 5); TextOut(8,4, "matrx_algb");
   display_update();

   time0 = systick_get_ms();
   s = test_Sort();
   runtime[5] = systick_get_ms() - time0;
   NumOut(0,5, 5, 1); NumOut(2,5, (int)runtime[5], 5); TextOut(8,5, "arr_sort");
   display_update();

   time0 = systick_get_ms();
   s = test_TextOut();
   runtime[6] = systick_get_ms() - time0;
   display_update();


   time0 = systick_get_ms();
   s = test_graphics();
   runtime[7] = systick_get_ms() - time0;

   displayValues();

   systick_wait_ms(10000);
   display_clear(1);
   y = 0;
   for (x = 0; x < 8; ++x) {
      y += runtime[x];
   }

   TextOut(0,0, "sum ms:");    NumOut(8,0, y, 7);
   TextOut(0,1, "benchmark:"); NumOut(8,1, 50000000/y, 7);

   TerminateTask();
}

}
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 17. Dez 2013 20:08

super Zusammenarbeit, vielen Dank, Martin!

Jetzt hat man doch mal eine Basis, auf der man testen, untersuchen, verbessern und vergleichen kann !
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 17. Dez 2013 20:29

Ja sieht ganz gut aus. Bin etwas enttäuscht das das Programm ohne NXT-Bios schneller läuft. Durch den Test weiß ich jetzt das ich bei kleineren Programmen bei der EFW bleiben kann :)

Die Werte von NXC sehen richtig schlimm aus gegen die anderen. Wäre super wenn sich noch wer von RobotC oder Java meldet.
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 17. Dez 2013 20:33

ja, finde ich auch mit Java und RobotC -
und wenn du die Basis für nxtOSEK noch optimieren kannst - np, sag Bescheid und lad die neuen Werte hier hoch!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 17. Dez 2013 20:44

Hast du im Mindboards die Tabelle noch nicht geändert oder dauert das schon wieder so lange?
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 17. Dez 2013 22:01

wieso? ist doch aktuell, dachte ich, oder?
http://sourceforge.net/apps/phpbb/mindboards/viewtopic.php?f=3&t=2035&start=0
0 30 int_Add
1 165 int_Mult
2 645 float_op
3 65 rand_arr
4 58 matrix_al
5 506 arr_sort
6 17 disp_txt
7 188 grafics

Gesamt MS: 1694
Benchmark: 29515
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 18. Dez 2013 09:20

0 25 int_Add
1 164 int_Mult
2 215 float_op
3 55 rand_arr
4 39 matrix_al
5 440 arr_sort
6 16 disp_txt
7 161 grafics


Die Werte was du hast sind nicht mit der EFW sondern mit NXT-Bios.
Das sind 2 verschiedene Systeme/Benchmarks
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 18. Dez 2013 11:17

hi,
hatte die gar nirgends gesehen -
macht aber ja nichts, ich tausche sie schnell aus!

ist das eigtl richtig, dass bei deinem Code 2x am Schluss hintereinander geschweifte Klammer zu stehen muss?

Code: Alles auswählen

//
   TextOut(0,0, "sum ms:");    NumOut(8,0, y, 7);
   TextOut(0,1, "benchmark:"); NumOut(8,1, 50000000/y, 7);

   TerminateTask();
}

}


source codes:
http://sourceforge.net/apps/phpbb/mindboards/viewtopic.php?f=3&t=2035&start=0
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 19. Dez 2013 08:05

Ja das kommt vom C-Linker. Ich benutze ja normal den C++ Compiler.

Code: Alles auswählen


extern "C" {

// C Code

}

Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 19. Dez 2013 08:37

aaaa- ha ! :)

eine winzigkleine Bitte zum Schluss:
Damit alle anderen den test ausprobieren können, werden sie auch die Grafiktest-Routinen brauchen.
Wärst du so lieb und würdest sie bitte noch mit in den Code einfügen ? 8-)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Benchmark Test für NXT und EV3

Beitragvon HaWe » 19. Dez 2013 20:30

in Version 1.0 haben bei dem Int-Multiply-Test zuviele Additionen in den for-Schleifen den Test verfälscht.
hat für EV3/C gar keinen Einfluss (also wschl auch nicht bei nxtOSEK/C) , aber sehr großen Einfluss auf NXC gehabt (ist jetzt besser).

Hier ist der neue:

Code: Alles auswählen

long test_Int_Mult() {
  int x,y;
  volatile long s;

  for(y=0;y<2000;++y) {
    s=1;
    for(x=1;x<=13;++x) { s*=x;} // s=s*x
    for(x=13;x>0;--x) { s/=x;}  // s=s/x
  }
  return s;
}

https://sourceforge.net/apps/phpbb/mindboards/viewtopic.php?f=3&t=2035&p=17769#p17769
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Martin0x5E
Schreibt super viel
Schreibt super viel
Beiträge: 496
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

Re: Benchmark Test für NXT und EV3

Beitragvon Martin0x5E » 22. Dez 2013 17:41

Tut mir leid das ich erst jetzt schreibe, habe gerade ziemlich viel Arbeit. :/

Du kannst den Code für die Grafik-Funktionen hier finden: https://github.com/martin-au/NXtpandedLib/blob/master/LcdDrawer.hpp
Bitte den Code aber nicht kopieren: Erstens hängen da noch einige Header dran die dann auch alle kopiert werden müssten und zweitens wird der Code in Github ständig upgedated und sollte daher nicht irgendwie vom Projekt abgekapselt werden.
Also bitte nur verlinken.
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/


Zurück zu „Allgemeines zu Lego Mindstorms NXT und EV3“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss