Schach für ARM Cortex

Gast #5639248
Lesenswert?

Guten Abend Freunde der Elektronik!

Für den AVR und früher für den ZX81 gibt/gab es kleine Schachprogramme. 
Gibt es so etwas auch für Arm Cortex, die sicherlich aufgrund ihrer 
Rechenpower eine interessante Spielstärke erreichen könnten. Tante 
Google führt mich nur zu käuflichen Schachcomputern mit den Prozessoren.
Gruß

Uwe
Beitrag #5639263 wurde von einem Moderator gelöscht.
Gast #5639304
Lesenswert?

mit solch einer Frage sind offenbar einige hier schwer 
unterfordert...wie so oft..wird aus einer einzigen EINFACHEN Frage eine 
etliche Stunden laufende Diskussion..der nächste fragt dich gleich was 
Du denn damit willst..der nächste kommt damit das Du deine Anforderungen 
nicht klar ausgedrückt hast etc pp.
Ein Trauerspiel....
#5639464
Lesenswert?

Dr. Sommer schrieb:
> Warum soll der Algorithmus speziell für ARM sein? Ein in korrektem C,
> C++, Java, C#, ... geschriebener Schach-Algorithmus läuft auf jedem
> Prozessor. Auch wenn er irgendwann mal für ZX81 konzipiert war.

Das ist so erstmal korrekt und im Falle von Stockfish läuft das ja auch 
so auf jedem Android-Handy. Für einen Cortex-M dürfte Stockfish 
allerdings zu groß sein.

Das hier sieht für mich aber sehr interessant aus: 
https://www.ct800.net/

Interessanter Spielstil und mit etwa 2100 Elo auch nicht so ganz ohne ;)
Gast #5639477
Lesenswert?

Dann nimmst du halt einen beliebiges Schachprogramm in C, wie dieses...
https://github.com/fogleman/MisterQueen

...und jagst das durch deinen Compiler.

Ob genau DAS für dich tut, weiß ich nicht. Ich haber nur schnell das in 
Google eingetippt. Aber du wirst fündig werden, denke ich.

Ja, das tut man so. Denn C ist eine Hochsprache, und ist im Normalfall 
Hardwareunabhängig. Um die Umsetzung auf deinem ARM Cortex kümmert sich 
dein Compiler. Im Höchstfall mussst du geringe Anpassungen machen.
#5639486
Lesenswert?

Dr. Sommer schrieb:
> Warum soll der Algorithmus speziell für ARM sein? Ein in korrektem C,
> C++, Java, C#, ... geschriebener Schach-Algorithmus läuft auf jedem
> Prozessor. Auch wenn er irgendwann mal für ZX81 konzipiert war.

Das kommt halt ganz darauf an, wieviele Möglichkeiten man vorausrechnen 
will. Mit einer intelligenten Software kann man den Entscheidungsbaum 
schon mal vereinfachen. Aber die Rechentiefe ist abhängig von 
Prozessorleistung. Wenn man jetzt z.B. mit Assembler arbeitet oder 
Kombinationen damit macht, denke ich, dass ein paar Ebenen mehr drin 
sein sollten. Aber ob das nötig ist...
Gast #5639522
Lesenswert?

Patrick B. schrieb:
> Aber die Rechentiefe ist abhängig von
> Prozessorleistung.

Gute Software sollte man die natürlich an die Prozessorleistung anpassen 
(skalieren) können.

Patrick B. schrieb:
> Wenn man jetzt z.B. mit Assembler arbeitet oder
> Kombinationen damit macht, denke ich, dass ein paar Ebenen mehr drin
> sein sollten.

Ein paar Ebenen entspricht dann einer Potenzierung, also mehrere 
Größenordnungen schneller. Ich bezweifle dann doch, dass man von Hand in 
Assembler so viel effizienter kodieren kann, zumal es dank moderner 
Pipeline-Prozessoren überhaupt ziemlich kompliziert ist, all die 
Timing-Details zu beachten die der Compiler eingebaut hat.

Beispiel: Im "ARM System Developer's Guide" (2004) sind einige 
Optimierungen gezeigt, wie man seinen C-Code schneller machen kann, mit 
Beispielen was der Compiler aus der "langsamen" und "schnellen" Variante 
macht. Das habe ich mal ausprobiert - ein aktueller GCC produziert für 
alle Varianten den gleichen Code, der noch effizienter als das ist, was 
im Buch steht...
Gast #5639586
Lesenswert?

Dr. Sommer schrieb:
> Warum soll der Algorithmus speziell für ARM sein? Ein in korrektem C,
> C++, Java, C#, ... geschriebener Schach-Algorithmus läuft auf jedem
> Prozessor. Auch wenn er irgendwann mal für ZX81 konzipiert war.

Mit dem Ziel ARM Cortex zeige ich an, habe stark limitierten Speicher 
(256 Kb Flash), ebenso sehr stark limitiertes RAM, was für Hash Tables 
ein No go ist. Und ich möchte keinen Source Code haben, der unter 
Windows läuft, denn sollte auf Betriebssystemroutinen (Libraries) 
zurückgegriffen werden, ist Feierabend. Außerden sind die Windows- und 
Linux Schachprogramme meisten viel zu groß.

Source Code für Java- da brauche ich doch einen Java Interpreter 
(Runtime environment), das dürfte bei 256 kb Flash lustig werden...., 
oder?
Gast #5639597
Lesenswert?

Uwe M. schrieb:
> Und ich möchte keinen Source Code haben, der unter
> Windows läuft, denn sollte auf Betriebssystemroutinen (Libraries)
> zurückgegriffen werden, ist Feierabend.

Wozu braucht ein Schach-Algorithmus Betriebssystemroutinen? Die 
braucht's nur für die Nutzeroberfläche, die du sowieso neu schreiben 
musst.

Uwe M. schrieb:
> Außerden sind die Windows- und
> Linux Schachprogramme meisten viel zu groß.

Wenn man die Grafiken und Texte für die GUI rausnimmt wird das schon 
viel weniger. 256 KB Flash (oder mehr, manche STM32 haben 2 MB) wirklich 
komplett nur mit Code zu füllen muss man erst mal schaffen,

Uwe M. schrieb:
> Source Code für Java- da brauche ich doch einen Java Interpreter
> (Runtime environment), das dürfte bei 256 kb Flash lustig werden....,
> oder?
Es gibt Java für STM32.
Gast #5639600
Lesenswert?

Ein Arm-Cortex alleine sagt nichts aus.
Es gibt die A, die R und die M Reihe mit unterschiedlichen Profilen.
Dahinter kommt meist noch eine Zahl.

Ich habe hier gerade einen ARM Cortex A15. Der hat 4 Core mit 1.4 GHz. 
Daran hängen 2 Gbyte Ram.
Der kann es locker mit älteren Pentiums aufnehmen. Ich habe C++ und auch 
Qt darauf.

Wenn Arm, dann gib genau an, was du an Prozessor hast.
Gast #5639605
Lesenswert?

>Ich bezweifle dann doch, dass man von Hand in
> Assembler so viel effizienter kodieren kann,

Ich hatte mal dieses Jahr ein Morseprogramm in C auf dem GCC und dem IAR 
Compiler (Optimierung an) für einen M0+ geschrieben, sollte ein Test 
sein, dann exakt diesen Algorithmus Zeile für Zeile in Assembler 
formuliert. Auf Anhieb Faktor 2,5 schneller erreicht, und dann später 
bis zum Faktor drei optimiert. Natürlich weiß ich, daß Aufwand und 
Portierbarkeit grausam sind (Ausnahme Portierung innerhalb einer 
Familie). Ich will die Leistung eines C Compilers nicht schmälern, vor 
dessen Optimierungsleistung ich viel Respekt habe. Aber Assembler ist 
nun mal unerreichbar in Sachen Geschwindigkeit und Codegröße.
Gast #5639614
Lesenswert?

Patrick B. schrieb:
> Dr. Sommer schrieb:
>> Warum soll der Algorithmus speziell für ARM sein? Ein in korrektem C,
>> C++, Java, C#, ... geschriebener Schach-Algorithmus läuft auf jedem
>> Prozessor. Auch wenn er irgendwann mal für ZX81 konzipiert war.
>
> Das kommt halt ganz darauf an, wieviele Möglichkeiten man vorausrechnen
> will. Mit einer intelligenten Software kann man den Entscheidungsbaum
> schon mal vereinfachen. Aber die Rechentiefe ist abhängig von
> Prozessorleistung. Wenn man jetzt z.B. mit Assembler arbeitet oder
> Kombinationen damit macht, denke ich, dass ein paar Ebenen mehr drin
> sein sollten. Aber ob das nötig ist...

Wenn man damit die Tiefe erreicht das Endspieldatenbanken das korrekte 
Endergebnis berechnen können, dann hat man sehr viel erreicht.


Übrigens, der C64 mit 64k Memory und Colossus 4.0 war damals schon so 
stark ,daß wenn er hier gegen die Forenteilnehmer spielen würde, 
mindestens 95% aller Punke holen würde.
Gast #5639617
Lesenswert?

Uwe M. schrieb:
> Auf Anhieb Faktor 2,5 schneller erreicht, und dann später
> bis zum Faktor drei optimiert.

Wie üblich bei solchen Anekdoten wäre es schön, den genauen Code zu 
kennen. Beim M0 hat man wohl noch keine komplexe Pipeline und Cache, 
welche das Assembler-Programmieren erschweren.
#5640013
Lesenswert?

Dr. Sommer schrieb:
> Beispiel: Im "ARM System Developer's Guide" (2004) sind einige
> Optimierungen gezeigt

Hei danke. Ich arbeite nun schon Jahre mit ARM aber die gezeigten 
Optimierungen, respektive Compiler-Verhalten sind mir neu.
Verhalten sich andere Prozessoren ähnlich? Oder kann es passieren, dass 
der gleiche Code massiv unterschiedliche Performance hat, je nach 
Zielsystem?
Gast #5640031
Lesenswert?

Patrick B. schrieb:
> Verhalten sich andere Prozessoren ähnlich?

Worauf jetzt genau bezogen? Alle leistungsfähigen modernen Prozessoren 
haben Pipelines und Caches, falls es darum geht.

Patrick B. schrieb:
> Oder kann es passieren, dass
> der gleiche Code massiv unterschiedliche Performance hat, je nach
> Zielsystem?
Das sowieso. Was auf einem ARM schnell geht, kann beim AVR 
schnarchlangsam sein, allein schon weil der keinen Barrel-Shifter, 
weniger Adressierungs-Möglichkeiten, keine FPU, und natürlich weniger 
Bits pro Register hat.
Gast #5676682
Lesenswert?

Hallo,

der Autor des CT800 hier. Da ich meine Backlinks nicht täglich prüfe, 
hat es etwas gedauert. Dass es außer dem CT800 soweit ich weiß kein 
OSS-Schachprojekt auf Cortex-M gibt, liegt einfach daran, dass bislang 
sonst niemand ohne finanzielle Kompensation den nötigen Aufwand 
getrieben hat.

Man kann grundsätzlich PC-Engines auf Cortex-M bringen, der CT800 ist ja 
ein Fork von NG-Play. Bitboard-Engines wie Stockfish sind aufgrund des 
Speicherbedarfes praktisch nicht möglich. Auch mit dem Stackverbrauch 
muss man sich Gedanken machen, weil das auf dem PC kein Gesichtspunkt 
ist. Hashtabellen gehen, nur entsprechend kleiner.

Der Löwenanteil des Aufwands geht in das User-Interface - besonders, 
wenn man ein vollwertiges Gerät mit diversen Zeitmodi, Optionen und 
Eröffnungsbuch bauen will. Dazu noch die Hardware, schließlich muss man 
das alles aufbauen und für die Ansteuerung auch Treiber schreiben.

viele Grüße, Rasmus
Gast #5676869
Lesenswert?

Hallo Rasmus!

Vielen Dank für den Hinweis! Habe sofort deine Seite besucht und alles 
runtergeladen. Muss mich aber im Januar damit ausführlich beschäftigen, 
scheint umfangreich zu sein bei der Leistungsfähigkeit deines Programms, 
alle Achtung!!!
LG

Uwe
Gast #5676947
Lesenswert?

Hi Uwe,

Freut mich, dass es dir gefällt!

Da das ja ein Fachforum für embedded ist: schau dir im Moment die 
Treiberschicht lieber nicht zu genau an. ;-) Die braucht ein 
Refactoring, was für das nächste Release Anfang Januar geplant ist.

Vom Umfang her dürfte der größte Einzelposten wohl das Eröffnungsbuch 
sein: 22000 verschiedene Züge in 12000 Positionen, jeder einzelne von 
Hand eingegeben und mit einem Desktop-Pprogramm geprüft.

Wenn man die PC/Android-Version auf ungefähr 30 kNPS (30000 Knoten pro 
Sekunde) drosselt und die Hashtabellen auf 1 MB einstellt, kommt die 
Spielstärke dem realen Gerät schon sehr nahe.

viele Grüße, Rasmus
#5676989
Lesenswert?

Vielleicht so als Idee abseits eines ARM Cortex, falls das in Frage 
kommt:

Ich bastel mir gerade einen Schachcomputer zusammen. Die Schachengine 
(z.B. Stockfish oder Toga 2) läuft auf einem Raspberry Pi und die 
Ansteuerung des Schachbretts macht ein Arduino mit paar zusätzlichen 
ICs. Die Zuganzeige auf dem Schachbrett wird mit 64 LEDs gemacht. Die 
Position der Figuren wird mit AH1802 Magnetfeldsensoren ermittelt. Für 
die Bedienung habe ich ein Waveshare 5" Touch LCD über HDMI und USB an 
den Raspberry Pi angeschlossen.
Gast #5677174
Lesenswert?

Teilnehmer schrieb:
> Deshalb WAR das mal ein gutes Forum.

Paar Idioten gibt es immer, auch in der realen Welt. Vermiete mal 
Wohnungen..... Dennoch muss ich sagen, hatte hier von den mehrheitlich 
konstruktiv veranlagten Leuten tolle Tipps erhalten, etwa beim Einstieg 
in die ARM-Cortex M Welt, Löten von 0,5 mm Strukturen, Schach, man hat 
mir Kicad schmackhaft gemacht (ich liebe Kicad!), so daß mein 
Lebensabend richtig spannend geworden ist. Erst SAM D M0+ Projekt mit 
Kicad layoutet, dann zu ST gewechselt zum M4, geiles Ding. Ich danke all 
diesen Leuten und wünsche allen einen guten Rutsch nach 2019!

Uwe

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren