Protocol Buffer als Konfigurationsdateien?

Ich habe eine Weile lang nach einer möglichst bequemen Möglichkeit gesucht, Konfigurationsdateien zu lesen und zu schreiben, ohne mich selbst um das Parsen und Emittieren zu kümmern, außerdem sollten die Dateien nach Möglichkeit menschen-lesbar sein. Aus letztgenanntem Grund habe ich deshalb auch zuerst an XML, JSON oder YAML gedacht, die leider alle einen Nachteil haben: Die verschiedenen (mir bekannten) Parser liefern entweder eine DOM-Repräsentation oder sind nur über SAX oder etwas Artverwandtes (z.B. yaml-cpp) zu bedienen. Beides erfordert mehr Handarbeit als mir recht war, inklusive Typprüfungen die ich selber vornehmen müsste und vieles mehr.

Read More…

Integertypen mit fester Breite

Ich hatte schon öfter mit Code wie dem folgenden zu tun:

#define UINT8 unsigned char
#define INT8 signed char
#define UINT16 unsigned short
#define INT16 short
#define UINT32 unsigned long
#define INT32 long

Das sieht auf den ersten Blick zwar harmlos aus, bringt aber einige Probleme mit sich. Zunächst mal sollte inzwischen auch der Letzte gemerkt haben, dass 64-Bit CPUs, Betriebssysteme und Compiler keine Seltenheit mehr sind. Wenn man das weiß, und außerdem weiß, dass die Größen der einzelnen Datentypen in C und C++ gar nicht fest definiert ist, erkennt man schon das erste Problem: Auf einem 32-Bit Compiler unter Windows oder Linux haben die definierten Typen die richtige Größe, sobald man das ganze aber unter 64 Bit benutzt, kann es sein, dass z.B. der UINT32 aus diesem Beispiel plötzlich 64 Bit groß ist statt 32. Außerdem garantieren weder der C11- noch der C++11-Standard, dass ein char genau 8 Bit groß sein muss.

Read More…

Erste Schritte mit dem GDB

Immer wieder sehe ich erfahrene Softwareentwickler, die zwar einigermaßen einen grafischen Debugger bedienen können (sofern ihre Entwicklungsumgebung einen einfachen Button mit der Aufschrift “Im Debugger starten” hat), aber sobald sie unter Linux oder UNIX entwickeln, plötzlich ihr Programm wieder mit Debug-Ausgaben vollpflastern, wenn sie einen Fehler suchen. Klar gibt es auch hier IDEs wie Code::Blocks oder Eclipse, die eine GDB-Anbindung haben, und wem das ausreicht, der braucht hier nicht weiterlesen. Dieser Artikel ist für Leute, die wissen wollen, wie der Debugger im Textmodus zu betreiben ist.

Read More…

SIMD Programmierung mit GCC: Compiler Intrinsics

Einführung

In den letzten beiden Artikeln habe ich beschrieben, wie man die SIMD-Befehlssätze im GCC verfügbar macht, was der Compiler von sich aus schon automatisch vektorisieren kann und wie die expliziten Vektor-Erweiterungen generisch genutzt werden können. In diesem Artikel verlassen wir das Feld der prozessorunabhängigen Vektorprogrammierung und kümmern uns nur noch um Zielprozessoren mit SSE.

Read More…

SIMD Programmierung mit GCC: Vector Extensions

Einführung

In meinem letzten Artikel habe ich die ersten Schritte auf dem Weg zur SIMD-Programmierung mit GCC gezeigt. Diesmal soll es speziell um die Vector Extensions des GCC [1] gehen. Diese erlauben es, Vektoren von Typen zu definieren und die wichtigsten arithmetischen Operatoren direkt mit diesen zu verwenden. Das ist erstens wesentlich bequemer als selbst SIMD-Instruktionen im eigenen Code zu benutzen und zweitens abstrahiert der Compiler vom tatsächlich verwendeten Befehlssatz, was den Code portierbarer macht und ohne Änderungen am Code neuere SIMD-Erweiterungen benutzt, sobald der Compiler sie unterstützt. Im Vergleich zur Auto-Vektorisierung erfordern die Vector Extensions zwar mehr Programmierarbeit, sind allerdings auch wesentlich flexibler einzusetzen.

Read More…

SIMD Programmierung mit GCC: Erste Schritte

Einführung

SIMD [1] steht für “Single Instruction, Multiple Data” und bedeutet auch genau das: Der Prozessor führt den selben Befehl gleichzeitig auf mehreren Daten durch. Für x86-CPUs gibt es inzwischen einige verschiedene Befehlssatzerweiterungen, angefangen bei der Multi Media Extension des gleichnamigen Pentium MMX und AMDs 3DNow!, über die verschiedenen Streaming SIMD Extensions [2] (SSE bis SSE4) bis hin zu den Advanced Vector Extensions (AVX und AVX2) der aktuellen und nächsten Generation von Intels Core Prozessoren.

Diese Befehlssatzerweiterungen mit GCC zu benutzen ist an sich nicht kompliziert, es gibt aber ein paar Kleinigkeiten zu beachten.

Read More…

Follow

Get every new post delivered to your Inbox.