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: 497
Registriert: 17. Dez 2011 11:39
Wohnort: Österreich

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

Beitragvon Martin0x5E » 14. Dez 2013 21:16

Beim NXT ist es ja so das der Display gar nicht schneller als 16 ms upgedated werden kann. (hardwaretechnisch)
Der Benchmark sollte meiner Meinung nach die Softwareimplementierung auf der CPU messen und nicht die IO-Hardware.

Für sowas gibts Hardware Tests. Du würdest ja auch zb mit dem Benchmark nicht darauf kommen wie schnell die Sensorwerte abgefragt werden können.

Idee: Eigene Abteilung für Hardware Tests ;)
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon HaWe » 14. Dez 2013 22:37

übrigens rechnet der NXT mit 32 bit - float Arithmetik Matrizen-Determinaten falsch aus - nur mindestens mit 64 bit double werden sie korrekt berechnet:

bei dieser Matrize

Code: Alles auswählen

float R[3][3]; float det;
     R[0][0]=111;  R[0][1]=444; R[0][2]=777;
    R[1][0]=222;  R[1][1]=555; R[1][2]=888;
    R[2][0]=333;  R[2][1]=666; R[2][2]=999;


errechnet er fälschlich als Determinante 24, richtig ist aber 0 !

Leider hat JH nie double auf dem NXT für NXC implementiert, was er aber theoretisch gekonnt hätte (war ihm zuviel Arbeit).

LeJos bietet allerdings double auf dem NXT - ein Riesen-Vorteil, nicht nur für Bewegungs- und Ortsvektoren- Berechnung für Navigatons-Roboter!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

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

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

Beitragvon HaWe » 15. Dez 2013 00:34

ich habe den benchmark jetzt auch im RobotC Forum veröffentlicht:
http://www.robotc.net/forums/viewtopic.php?f=1&t=7463

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

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

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

Beitragvon HaWe » 15. Dez 2013 10:02

noch einen Bug entdeckt:
am Anfang von main muss es anstelle von
a[y]=randM();b[y]=randM();c[y]=randM();
richtig heißen:
a[y]=randM()%30000; b[y]=randM()%30000; c[y]=randM()%3000

hat aber keinen Geschwindigkeitsunterschied, nur zu debug-Zwecken.

Ich habe übrigens statt meinem shellsort alternativ auch den qsort aus der stdlib.h testweise implementiert und ausprobiert - ist noch langsamer (>800 ms):

Code: Alles auswählen

int compare_ints (const int *a, const int *b)
{
  int temp = *a - *b;
  if (temp > 0)
    return 1;
  else if (temp < 0)
    return -1;
  else
    return 0;
}


long test_Sort(){
  unsigned long s;
  int y;

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

    qsort (a, 500, sizeof (a[0]), compare_ints);
    qsort (b, 500, sizeof (a[0]), compare_ints);
    qsort (c, 500, sizeof (a[0]), compare_ints);   
  }

  return y;
}

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

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

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

Beitragvon Martin0x5E » 15. Dez 2013 10:03

Ich glaube du verstehst mich nicht richtig.

Die Enhanced Firmware von JH puffert auch alles in ein byte array. Der Puffer wird dann alle 17 ms an die Hardware geschickt.
Das ist hier im source code der Firmware dokumentiert:

Code: Alles auswählen

//
// Programmer
//
// Date init       14.12.2004
//
// Reviser         $Author:: Dktochpe                                        $
//
// Revision date   $Date:: 17-02-06 8:45                                     $
//
// Filename        $Workfile:: c_display.iom                                 $
//
// Version         $Revision:: 30                                            $
//
// Archive         $Archive:: /LMS2006/Sys01/Main/Firmware/Source/c_display. $
//
// Platform        C
//

...
UBYTE   *Display;                                         // Display content copied to physical display every 17 mS
...



Du kannst das ganze selbst mit diesem kleinem NXC Programm testen:

Code: Alles auswählen

task main() {
   NumOut(0, 0, 1000);     // Write to display-buffer
   
   Wait(3000);             // now we can see it because of 17ms refresh
   
   ClearScreen();
   TextOut(0, 0, "Disable Refresh");
   Wait(1000);
   SetDisplayFlags(DISPLAY_REFRESH_DISABLED);   // now disable refresh
   Wait(100);
   NumOut(0, 20, 1000);                         // now our data will not be displayed!

   Wait(3000);
}



Bei nxtOSEK ist es also so das es keinen Prozess im Hintergrund gibt der den Display regelmäßig "refreshed".
In der Dokumentation ist auch explizit beschrieben das man das Updaten unter 16 ms lassen sollte weil man damit den Hardware-Bus überlastet.
Wie soll ich jetzt also einen Vergleich darstellen? Entweder ich implementiere auch einen 2. Task der den Display refreshed oder ich mache es so wie jetzt.
Mit einem 2. Task würde ich jetzt nicht für sehr sinnvoll heißen, da das ja dann nicht die grundsätzliche Implementierung von nxtOSEK wiederspiegelt.
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon Martin0x5E » 15. Dez 2013 10:15

Code: Alles auswählen

a[y]=randM()%30000; b[y]=randM()%30000; c[y]=randM()%3000
// letzte Zahl 3000 oder auch 30000?


Float habe ich jetzt wieder auf double geändert.

Habe übrigens bei meinen Stöbern in der FW des NXT die Implementierung des Shell-Algorithmus gefunden.

Code: Alles auswählen

void shell_sort_s4(SLONG* A, UWORD size)
{
  UWORD i, j, increment;
  SLONG 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 = (UWORD) (increment / 2.2);
  }
}
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon HaWe » 15. Dez 2013 10:38

schön ! :)
teste doch mal bitte deinen gegen "meinen" in deinem nxtOSEK-Programm (vllt 3-5 Tests pro alg) - wir können dann auf jeden Fall den schnelleren nehmen!

ps
den habe ich schon mal irgendwo gesehen, das mit dem
(UWORD) (increment / 2.2)
kommt mir bekant vor !
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

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

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

Beitragvon HaWe » 15. Dez 2013 10:43

aah - musste man umschreiben, funzt!

Code: Alles auswählen

void shellsort(int size, SLONG* A)
{
  int i, j, increment;
  SLONG 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);
  }
}


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

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

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

Beitragvon Martin0x5E » 15. Dez 2013 10:46

Code: Alles auswählen

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 = (int)(increment / 2.2);
  }
}


Immer gleich:
Deiner: 2542 ms
Neu: 2178 ms

Mir kommt das mit dem /2.2 etwas komisch vor; hoffe ich mache das richtig mit dem cast auf int.
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon HaWe » 15. Dez 2013 10:48

immerhin 1/5 ~= 20%, bei mir auch -20%!

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

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

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

Beitragvon Martin0x5E » 15. Dez 2013 14:58

Bei mir wird der Display jetzt auch noch immer viel zu oft upgedated.
Wenn man rechnet 50 iteration in 40ms => d.h. der Display wird unter 1ms refreshed. Ich habe gerade vor das Updaten noch etwas zu erhöhen um ca gleich zu sein mit den 17ms von NXC.

Code: Alles auswählen

long test_TextOut() {
   int y;

   for (y = 0; y < 50; ++y) {
      // clear without update !? only clear buffer, this should be advantage for nxtOSEK
      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();
   }
   return 99;
}



Zweites Problem: Ich schleife im Moment auch noch die efw mit nxtOSEK mit. Mit den Grafik-Ausgaben scheint mir jetzt der RAM während der RT auszugehen!
Das Programm ohne efw auszuführen funktioniert zwar; wollte ich aber noch mal als eigenen Benchmark anlegen da dann auch auf dem ROM geschrieben wird.

Kannst du irgendwie das Programm etwas kleiner machen? Zb die Arrays verkleinern, dafür mehr Iterationen?
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon Martin0x5E » 15. Dez 2013 15:11

Ok das mit dem Display ist hinfällig. Habe mal das Updaten aus der Schleife genommen und es bringt einen wahnsinnigen RT Vorteil von 1 ms :D
Ich glaube das ein zu schnelles schreiben einfach gar nicht zugelassen wird. (So etwas wie "line is busy" bei BUS-Systemen)
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon HaWe » 15. Dez 2013 18:39

das liegt dann ja nicht so schrecklich weit auseinander!
Das heißt dann also, NumOut alleine macht noch gar nichts, erst die Funktion displayUpdate versucht es "physikalisch" zu schreiben,
Und überspringt die Ausgabe und geht einfach weiter zum nächsten Befehl, wenn das Display noch nicht bereit ist? Nun gut, ist dann halt so.

d.h. der Benchmark zeigt dann was insgesamt an? 42? oder 42 plus x ?
wäre dann ein Wait(20) dazwischen evtl. der Königsweg?

ach, und noch was:
schreibst du jedes NumOut und jedes TextOut einzeln, jeweils ein displayUpdate dazwischen?
Oder schreibst du zeilenweise (wie ich in C) , und zwischen den Zeilen nur 1 displayUpdate ?
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

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

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

Beitragvon Martin0x5E » 16. Dez 2013 10:11

Das ist nicht wirklich ein Königsweg. Bei mir kommt jetzt genau 0 heraus.

Code: Alles auswählen

long test_TextOut() {
   int y;

   for (y = 0; y < 50; ++y) {
      // clear without update !? only clear buffer, this should be advantage for nxtOSEK
      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");        display_update(); systick_wait_ms(20);
      NumOut(0,1, 1, 1); NumOut(2,1, 1010, 4); TextOut(8,1, "int_Mult");     display_update(); systick_wait_ms(20);
      NumOut(0,2, 2, 1); NumOut(2,2, 1020, 4); TextOut(8,2, "float_op");     display_update(); systick_wait_ms(20);
      NumOut(0,3, 3, 1); NumOut(2,3, 1030, 4); TextOut(8,3, "rand_array");     display_update(); systick_wait_ms(20);
      NumOut(0,4, 4, 1); NumOut(2,4, 1040, 4); TextOut(8,4, "matrx_algb");     display_update(); systick_wait_ms(20);
      NumOut(0,5, 5, 1); NumOut(2,5, 1050, 4); TextOut(8,5, "arr_sort");       display_update(); systick_wait_ms(20);
      NumOut(0,6, 6, 1); NumOut(2,6, 1060, 4); TextOut(8,6, "displ_txt");    display_update(); systick_wait_ms(20);
      NumOut(0,7, 7, 1); NumOut(2,7, 1070, 4); TextOut(8,7, "testing...");    display_update(); systick_wait_ms(20);
   }
   return 99;
}



Ich kann mir schon denken was das Problem ist. Die Ausgeben in einer Zeile vor dem systick_wait_ms(20) braucht weniger als 1 ms.
So fließt nur das Wait(20) in die Berechnung ein:
Am Anfang der Zeile Systemzeit zb: 10 ms
Vor systick_wait_ms(20) ist keine ms vergangen Systemzeit: 10ms
Nach systick_wait_ms(20) wird genau 20 ms gewartet Systemzeit: 30 ms.

Unterm Stricht braucht dann eine Zeile 20 ms, was nachher wieder herausgerechnet wird. Herauskommen tut dann 0.

es ist ja nicht glaubhaft, dass der NXT schneller sein soll der ev3, der braucht ja schon 70 ms.


Also wenn du dir darüber Gedanken machst. Versuch mal die Zeit zu messen was sprintf wegnimmt. Ich habe sprintf bewusst nicht benutzt, da ich mich strikt an die NXC Lösung gehalten habe.
Weiteres ist die Display-Ausgabe bei nxtOSEK sehr hardwarenah/direkt implementiert. Es muss eigentlich nur die Position im Buffer-Array berechnet werden und die Zahl muss in einen String umgewandelt werden.
Soweit ich weiß hat der EV3 auch einen größeren + besseren Display?
Projekte und Informationen auf meiner Website: http://roboticsaumair.jimdo.com/

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

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

Beitragvon HaWe » 16. Dez 2013 11:00

stimmt, das mit den Wait(20) ist mir jetzt beim testen auch aufgefallen, bei sehr vielen Waits kommen sogar teilw. negative Werte raus.

Also: was tun?
Ich will ja nun mal die echte Bildschirmausgabe-Geschwindigkeit für Text und für Grafik berechnen, und es soll keine Ausgabe "verschluckt" werden - was schlägst du vor?

beim ev3 geht es überigends nur mit sprintf + lcdOut, alles andere ist nicht implementiert, aber nach den vorgesehenen API-Mustern wäre
TextOut etc.
auch nichts anderes als ein #define für sprintf + lcdOut.

habe jetzt Wartezeit 20ms nach jedem Bildschirmaufbau eingesetzt (sieht sehr plausibel aus, finde ich) und auch sonst alle Einzeltests nochmal überarbeitet, um ausgeglichenere und aussagekräftigere gewichtete Werte zu bekommen.

Code und Tabelle ab jetzt nur noch hier:
https://sourceforge.net/apps/phpbb/mindboards/viewtopic.php?f=3&t=2035&p=17769#p17769

ps
habe gerade erst gesehen:
der MB-Forums-Editor hatte meine Änderungen nicht gespeichert und wieder die alten geladen.

Jetzt stimmen aber Code und Tabelle endlich (hoffentlich) - bei nxtOSEK hochgerechnete Werte auf Grund der letzten Daten.
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E


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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss