Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Optimale Compilierung von Quelltexten
1 2 Previous Next  
Parent - By Chess Player Date 2013-11-13 17:44
Hallo Wolfram,

so etwa wie Finger weg!
Parent - - By Thomas Plaschke Date 2013-11-13 16:08
Die diversen Steuervariablen findet man in der make-Datei makefile.
Als Target (=Zielsystem) gibt man NT_i386 an. Das ist - leicht erraten - Windows. Für Windows ist allerdings kein Abschnitt in der make-Datein enthalten. Für TDM-minGW ist der aber schnell ge-copied-und-pasted:
Code:
Windows64:
  $(MAKE) target=NT_i386 \
    CC=gcc.exe CXX=g++.exe \
    CFLAGS='-w -pipe -m64 -O2 -march=corei7 -msse4.2 -fno-exceptions' \
    CXFLAGS='-w -pipe -m64 -O2 -march=corei7 -msse4.2 -fno-exceptions -fno-rtti' \
    LDFLAGS='$(LDFLAGS) -s -lpthread -static-libgcc' \
    opt='$(opt) -DINLINE64 -DHAS_64BITS -DCPUS=16 -DPOPCNT' \
    crafty-make

Mit der Konstanten CPUS gibt man an, mit bis zu wie vielen threads Crafty maximal laufen können soll. (Der Parameter mt in crafty.rc steuert, wie viele von den mit CPUS 'vorbereiteten' threads Crafty nutzen soll.) Um bis zu 16 threads zu ermöglichen schreibt man CPUS=16.
Dann gibt es noch ein paar hardware-spezifische Konstanten : POPCNT für Prozessoren mit SSE 4.2 oder besser sowie INLINE64 und HAS_64BITS für 64-Bit-compiles.

Die Datei makefile.xp ist für Microsoft C++.

Benutzt man ein Entwicklungssystem mit Benutzeroberfläche, wie Visual Studio, Code::Blocks oder DevCpp, setzt man die Konstanten unter 'Parameter' oder 'defines' ein. - Oder man setzt sie manuell in einer bestimmten Header-Datei  - chess.h, glaube ich. - Es gibt aber ein ziemliches Geraffel, wenn man da was falsch macht!

Ich hoffe hilfreich gewesen zu sein.
Gruß
Th. Plaschke
Parent - - By Chess Player Date 2013-11-13 17:55
Hi Thomas,

ich benutze immer noch ein 32 Bit Windows, obwohl ich ein 64 bit System besitze. Nur unter
Linux fahre ich 64 Bit. An welcher Stelle muss ich dein Skript in das makefile schreiben?

Ich hatte Prof. Hyatt eine Mail geschickt, die Antwort steht noch aus. Vielleicht warte ich sie ab
bevor ich selber Hand anlege.

Danke für die ausführliche Antwort.

C.P.

P.S.

Ich bin davon ausgegangen, dass die Sourcen komplett sind egal ob für Windows oder Linux Systeme.
Leider habe ich keine Hinweise dazu gefunden. Peter Skinner hat Exe Dateien für Crafty 23.8 veröffentlicht.
Da wollte ich es selber auch mal versuchen...
Parent - - By Thomas Plaschke Date 2013-11-13 20:23
Peter Behringer dürfte richtig liegen.
Vorweg: Ich lebe im Windows-Dorf und habe kein Fernweh, aber im Linux-Land werden threads mit der POSIX-Bibliothek umgesetzt. Wanderer haben berichtet: Für Windows gibt es ebenfalls eine passende Umsetzung (Bibliothek für minGW, entsprechende include-Dateien und pthread.DLLs) oder man nimmt gleich cygwin, das ja die Linux-Umgebung auf Windows abbilden will ...
oder man setzt die entsprechenden Parameter, wie sie von Prof. Hyatt vorbereitet wurden.

Ich habe den Quellcode mit minGW 4.8.1 für 64-Bit compiliert. Klappte auf Anhieb.
Die Windows-Ergänzung in der make-Datei habe ich zu den anderen Targets gesetzt. Bei mir steht sie zwischen der 'help'- und der 'aix'-Sektion.

Die Erstellung des 32-bit-Kompilats ist allerdings der Grund, warum ich erst jetzt antworten kann. Zunächst scheint doch ein (Syntax-?)Fehler im Quellcode zu sein. In der Datei inline32.h wurde die inline-Assembler-Funktion PopCnt(uint64_t word) nicht beanstandet, wenn die Variablen dummy1 - dummy4 als unsigned int deklariert wurden.

Also: unsigned int dummy1, dummy2, dummy3, dummy4;
statt: uint64_t dummy1, dummy2, dummy3, dummy4;

Scheint ein echter Fehler zu sein. Der Algorithmus braucht die Variablen nicht als uint64_t.

Danach wollte minGW aber nicht linken. - Bibliotheksfehler. Lösung: 32-Bit-Programme linkt man nicht mit 64-Bit-Bibliotheken. Für 32-Bit sollten die 64-Bit-Bibliotheken nicht sichtbar sein. Also Umgebungsvariable PATH anpassen. Danach noch über ein paar Eigenheiten des 32-Bit-Compilers wundern und fertig war die 32-Bit-Fassung von Crafty 23.8

Ich hoffe, Du kannst das Rezept nachkochen
Gruß
Th. Plaschke
Parent - - By Chess Player Date 2013-11-15 15:57
Hallo Thomas,

ich habe es spät gesehen mit den beiden makefiles. Sinngemäss habe ich das makefile
gelöscht und das makefile.xp in makefile umbenannt. Danach bekomme ich diese Meldungen und das Compilieren
wurde abgebrochen.

im init.c:   struct stat *fileinfo = malloc(sizeof(struct stat));

bekomme ich diese Meldungen im Linker:

crafty-23.8/init.c:736:53: error: invalid conversion from 'void*' to 'stat*' [-fpermissive]

crafty-23.8/init.c:763:26: error: 'fileno' was not declared in this scope
Parent - By Thomas Plaschke Date 2013-11-15 23:29
Mir scheint, dass Du da etwas vermischt hast.

In Zeile 13 des von Dir benutzten Makefiles steht:

# The makefile is set up for Microsoft Visual C++ 6.0 Intel.

Die zitierten Fehlermeldungen stammen aber aus Passagen, für die gelten muss #if defined(UNIX). Das passt nicht zu Visual C++, denke ich.

Mit gcc oder minGW unter Windows, würde ich im Übrigen das ursprüngliche Makefile und nicht makefile.xp benutzen. Für Windows sollte target=NT_i386 gesetzt sein, sodass die Abschnitte nach #if defined(UNIX) grundsätzlich nicht compiliert werden. Damit erübrigen sich die Fehlermeldungen.

Unter Visual C++ würde ich ohnehin die GUI und nicht makefile.xp benutzen. Das Projekt so einzurichten, dass eine lauffähige Crafty 23.8.exe entsteht, ist schnell gemacht. Es sind eigentlich die gleichen Präprozessordefinitionen zu setzen. Man muss nur darauf achten (ist mir erst beim Erstellen der 64-Bit-Version aufgefallen ), dass die Abschnitte mit dem Inline-Assembler (Dateien inline32.h und inline64.h) nicht MS-kompatibel sind (die intrinsics _BitScanReverse64, _BitScanForward64 und __popcnt64 kann man statt dessen einsetzen).

So, nun erstmal gute Nacht
Th. Plaschke
Parent - - By Peter Behringer Date 2013-11-13 22:41
"-march=corei7"

Der erste (und oftmals einzige) Punkt, den ich Makefiles erweitere/korrigiere - schon um nicht mit ermüdenden Einzelheiten auseinanderzusetzen - ist: -march=native (gibt in der Regel eine schnelleres Programm...ohne Schaden anzurichten (auf das Durchwühlen der gcc-Dokumentation kann ebenfalls verzichtet werden).

z.B.
$echo | gcc -dM -E - -march=native | sort
oder
$echo | gcc -dM -E - -march=native | grep SSE | sort
uswetcbla
Parent - - By Benno Hartwig Date 2013-11-14 13:57
Code:
-march=native
Bedeutet das nicht: Der Compiler guckt nach, was für eine CPU da ist, und dafür wird dann der Code erzeugt?
Solange man auf genau diesem Rechner bleibt, mag das sehr praktikabel sein. Aber man darf dann nicht den Wunsch haben, dass das Executable auch woanders lauffähig ist, oder?
Benno
Parent - By Peter Behringer Date 2013-11-14 17:59
Das ist richtig.
Up Topic Hauptforen / CSS-Forum / Optimale Compilierung von Quelltexten
1 2 Previous Next  

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill