Advanced Developers Conference C++ - native C++ im Blickpunkt (Tag 2)



  • Advanced Developers Conference C++ - native C++ im Blickpunkt

    3. und 4. Mai 2012 in Ohlstadt, Zugspitzland

    Native C++ gehört nach wie vor zu den wichtigsten Programmiersprachen – bei der Entwicklung von Betriebssystemen, Treibern oder hochperformanter Software ist sie die erste Wahl. Ein guter Grund für die zweite C++-Spezialausgabe der Advanced Developers Conference (ADC). c++.de hatte nicht nur eine Eintrittskarte für diese Veranstaltung verlost, sondern auch mit Martin Richter – Microsoft MVP und Moderator bei c++.de – einen kompetenten Berichterstatter vor Ort.

    Tag 2

    Microsoft Keynote: The Windows-8 Application Model (Boris Jabez)

    In dieser Session wurden die Themen, die Darius Parys bereits angesprochen hatte, noch einmal aufgegriffen und vertieft.

    Klar strich Boris Jabez am Anfang heraus, dass Content alles ist, um das es sich bei Metro und Windows 8 dreht.

    Er hat sich an einem fremden, für ihn neuen Tablett mit Windows 8 angemeldet und bekam automatisch alle seine favorisierten Einstellungen über seinen Skydrive und Windows-Live-ID auf dieses neue Gerät übernommen (Avatar, Metric, also Roam to the Cloud).

    Auch er stellte uns „Context before Chrom“ und den Kontextzoom vor, in dem sich Inhalte entsprechend der gewählten Detailtiefe anders darstellen. Er demonstrierte das Arbeiten mit Kontrakten, die das Teilen (Share) der Daten zwischen Apps einfach machen, ohne dass diese sich kennen müssen.

    Metro-Applikationen sind normale Windows-Anwendungen, wie wir sie bisher auch schon kennen. Die Prozesse werden durch Manifeste und die Signierung des gesamten Paketes abgesichert. Das heißt das gesamte Paket muss unverändert sein, wie es vom Appstore ausgeliefert wird, damit es ausgeführt werden kann.
    Das Betriebssystem führt dabei Prüfungen durch, die der App entsprechend seiner Manifeste auch den Zugriff auf die entsprechenden Daten und Sensoren des Rechners gestatten. Dabei wird die bekannte Sessionisolation verwendet, die wir bereits seit Windows Vista kennen und die es erlaubt, dass zum Beispiel der Internet Explorer in einer eigenen „Sandbox“ läuft. Oder genauer: In einer Session mit niedrigeren Privilegien läuft, die keinen Zugriff auf Daten und Informationen höherer Sessions hat. Damit können einfach über den Servicebroker bestimmte Operationen direkt blockiert oder erlaubt werden.

    Metro-Applikationen können sich dabei im Status Running – Suspended – Terminated befinden. Anwendungen erhalten ein Zeitfenster von 5 Sekunden um den aktuellen Status zu sichern, wenn sie auf Suspended wechseln. Beim Übergang von Suspend auf Terminated ist keine Benachrichtigung und keine Aktionsmöglichkeit mehr vorhanden.

    Weiter ging Boris Jabez auf die Tools und Applikationsmodelle ein, mit denen eine App erzeugt werden kann.

    Bemerkenswert dabei ist, dass grundsätzlich erst einmal die gesamte Metro-API nativ ist. Kein Managed Code! Der Zugriff aus Java oder der .NET-Welt erfolgt ausschließlich über COM. Innerhalb von Metro können folgende Bibliotheken und Libraries verwendet werden: CRT, PPL, Win32 (teilweise), ATL (teilweise). Die MFC bleibt hier klar außen vor.

    Als Grafische Oberflächen bieten sich HTML + CSS + Javascript (gehostet im IE), XAML mit .NET oder auch C++, oder eben pures DirectX (die eigentliche Grafikschnittstelle) an. Es gibt keine GDI oder GDI+.

    Alles zum Entwickeln einer Metrostyle-APP ist in VS 11 Express drin. Das schließt Codetest, Unittest und Deployment ein. Also alle Schritte von Design über Configure zu Simulate und Test. Auch Tools zum Testen und zur Simulation, falls kein Touchdevice vorhanden ist, sind komplett in VS-11 Express vorhanden.
    Siehe http://dev.windows.com .

    In einem Gespräch danach mit Steve Teixeira bekam ich noch folgende Information: VS-11 Express kann nur noch Metro-Style Apps erzeugen. Diese Express-Version umfasst alle Sprachen in einem Paket. Desktop-Anwendungen und Windows-Console-Anwendungen lassen sich mit diesem Paket nicht mehr erzeugen!

    Using Windows Runtime with C++ (Steve Teixeira)

    Steve Teixeira schloss mit einem passenden Vortrag über die neue Sprachevariante C++/CX an. (Persönliche Anmerkung: Es ist eine rein native Spracherweiterung für C++, die C++/CLI extrem ähnlich sieht, C++/CLI wurde nicht einmal genannt, aber das Design und der Sprachsyntax sind extrem ähnlich). C++/CX hat ein eigenes strenges ABI (Application Binary Interface). Es ist sicher über eigene Datentypen der WinRT abgebildet (.NET nicht unähnlich).

    Die Datentypen umfassen Erweiterungen mit: ref class , value class , interface class , property , event , delegate , generic . Sowie auch gcnew (das bisher nicht verwendet wird), und ref new .

    Wir finden auch ^ Strong-Pointer und % Strong-Reference, wie in C++/CLI. WinRT benutzt nur die Strong-Defined-Datatypes und für die angelegten Ref-Classes eine Referenzzählung. Letzten Endes ist intern alles COM!

    Public-Funktionen einer Klasse dürfen ausschließlich WinRT-Typen verwenden. Ansonsten kann man alle bekannten C++-Klassen und Datentypen mit WinRT -Daten wahlfrei mischen.

    Das Interface-Prinzip ist ähnlich wie in .NET. ref Datentypen sind immer Heap basierend, haben aber auch eine Unterstützung für Stacksemantic, wie sie aus C++/CLI bekannt ist.

    Die Sprache hat ein eigenes Exception-Handling, basierend auf COM-Exceptions. Dabei werden diese auf der Modulgrenze entpackt, neu erzeugt und im nächsten Modul erneut geworfen. Exceptions sind also garantiert sicher, auch über Modulgrenzen hinweg.

    Templates werden auch möglich, allerdings werden hier die Instanziierungen der Daten in die Metadaten des WinRT-Models exportiert, nicht die Form des Templates selbst wie bei Generics.

    WinRT verwendet das gleiche Metadaten System wie .NET in .winmd -Dateien. Diese Dateien kann man über #using <xyz.winmd> in ein eigenes Programm einbinden. Die Metadaten lassen sich (Persönliche Anmerkung: Wer hätte es gedacht) mit IDLASM betrachten. Das bedeutet aber entsprechend auch, dass dieses andere Modul mit ausgeliefert werden muss, wenn es über #using integriert wurde. Alle öffentlichen Typen werden in der .winmd -Datei veröffentlicht.

    Die Platform::String^ -Klasse ist eine eigene String-Klasse, die Copy-on-Write unterstützt und auch auf Referenzzählung basiert. Sie kann direkt als const wchar_t* verwendet werden. Konstruktoren bestehen auch für std::wstring . (Persönliche Anmerkung: inwieweit dieser Datentyp mit BSTR identisch ist, konnte ich nicht in Erfahrung bringen.)

    Es existiert eine Windows::Foundation::Collection (z.B. IVector ), und es ist möglich alle Datentypen wahlfrei mit der STL und allen WinRT-Typen zu verwenden.

    Um eine "Smooth experience" zu sichern, sind fast alle Operationen aus der WinRT heraus asynchron. Es wird gezielt darauf geachtet, dass es keine Blocking-Szenarios gibt.

    Das geschieht indem man eine asnychrone Operation erzeugt und (vorzugsweise) mit einer Lamda Funktion definiert, was passieren soll, wenn die Funktion erfolgreich abgeschlossen wurde.

    Durch starke Schachtelung kann dies aber schnell unübersichtlich werden, deshalb empfiehlt sich hier das PPL-Pattern anzuwenden.

    C++/CLI und C++/CX können dabei in einem Modul nicht gemischt werden!

    Debugging Praxis (Matthias Wedemeyer)

    In seiner Session zeigte Matthias Wedemeyer einige erweiterte Methoden für das Debugging.

    Er brachte eine Einführung in die Debug-CRT, die helfen kann Memory-Leaks zu finden. Er zeigte dabei den Umgang mit _CrtSetBreakAlloc und _CrtCheckMemory , um auch die Ursachen für einen defekten Heapspeicher codenah zu entdecken.

    Dann zeigte er wie mit Dump- und Map-Dateien Crashes analysiert werden können. Er zeigte, wie man Crash-Adressen anhand von Map-Files dem Code zuordnen kann. Dazu wurde leider sehr in die Tiefe gegangen und der Vortrag hatte dadurch einige Längen und brachte manches nicht auf den Punkt.

    (Persönliche Anmerkung: ein anderer Einstieg direkt mit passenden PDB- und Source-Dateien wäre einfacher gewesen.)

    C++ AMP – Paralleles Rechnern mit der Grafikkaten (Bernd Marquardt)

    Themen über parallele Programmierung sind von allen letzten Konferenzen nicht mehr wegzudenken. Und so hat auch das Thema hier nicht gefehlt.

    Der Vortrag ist sehr ähnlich dem Vortrag über AMP, denn ich auf einem C++-Day in Bad Homburg im Frühjahr gesehen habe.

    Bernd Marquardt zeigte in einem (wie immer) unterhaltsamen Vortrag, wie mit der PPL (Parallel Pattern Library) und dem neuen AMP (Accelerated Massive Parallelism) ein weiterer Boost in bestimmten Algorithmen erreicht werden kann.
    Voraussetzungen sind DirectX 11-kompatible Grafikkarten. Die Erfahrung zeigt aber auch, dass dennoch nicht alle DirectX 11-Karten AMP unterstützen.
    Hier geht es um die Beschleunigung von SIMD-Problemen, d.h. Single Instruction for multiple data.

    Die Verzahnung von Grafikkarte und CPU geht weiter und man kann durch das Verlagern von Operationen aus der CPU auf die GPU noch einmal bis 100% bis zu 1000% Performancegewinn bekommen.

    Es lohnt sich definitiv nur bei extrem hohen Datenaufkommen mit gleicher (einfacher) Verarbeitung. Solche Kalkulationen sind eine Nischenanwendung und nur in einigen Problemlösungen nutzbar, doch aber eben effektiv.
    Man kann hierbei die Daten als Views (Datenabschnitte) zur Verfügung stellen, oder alle Daten in die Grafikkarte kopieren. Ob es sich lohnt, muss man in Tests ermitteln.

    Bei einem Beispiel einer Matrix-Multiplikation mit N=1024x1024 Matrixelementen wurden bei einfacher nicht paralleler Operation 7,9 Sekunden benötigt. Mit dem Einsatz von OpenMP (auf einem I7) waren es bereits nur noch 1/10 der Zeit mit 0,727 Sekunden. Das Ganze per AMP auf die Grafikkarte verlagert benötigt nur noch 0,08 Sekunden.

    Diese AMP-Bibliothek unterstützt auch intelligentes Unterteilen (Tiling). Das erfordert evtl. aber wieder auch wieder ein Synchronisieren der Teilergebnisse. Dies ist über die entsprechenden Templates relativ einfach zu erreichen. Das Problem ist dann eher, dass Tiling selbst schon bei der Matrixoperation einige Änderungen an den Algorithmen nötig macht. Statt drei Loops, muss man über verschiedene Kacheln optimieren und zusammenfassen.

    Ein weiteres Beispiel war eine N-Body-Simulation (Schwerkraftsimulation mit N Körpern). Hier dauerte die normale Berechnung mit N=8000 Köpern ohne Parallelisierung 1543 Sekunden, mit OpenMP 188 Sekunden, und beim Einsatz mit AMP nur noch 3,96 Sekunden.

    Das Problem ist immer wieder die Reduktion von Daten und Ergebnissen. Das heißt ein simples Aufsummieren in eine Variable ist komplex, denn mehrere Kerne können eben nicht gleichzeitig eine Summe addieren. Man macht dies über Teilsummen-Berechnungen. Solche Anpassungen sind komplex und man muss hier zugunsten der Geschwindigkeit auch einiges an Programmierarbeiten aufwenden.
    Wenn möglich sollten die Daten nur einmal übertragen und sofort berechnet werden. Wenn möglich alle Daten einmal in die GPU, alle komplexe Berechnung durchführen und die Ergebnisse einmal zurück.

    VS-11 hat entsprechende Debugfunktionen und Profiler sowie Visualisierungen für diese Parallelisierung auch auf der Grafikkarte eingebaut. Mit diesen kann man Bottlenecks oder auch Probleme gut isolieren.

    Man kann eine hohe Performance Steigerung erzielen, aber der Anpassungsaufwand ist nicht gering. Und die Effektivität können nur Tests zeigen.

    C++ 11 Concurrency (Michael Wong)

    Michael Wong zeigte uns Statements aus der Multithreading-Welt, die gänzlich simpel und unkompliziert aussahen, aber in denen immer auch versteckt Fehlerquellen verborgen waren, wenn man keine Annahmen über atomare Operationen machen kann.

    Das Problem ist, dass moderne CPUs die Ausführungsreihenfolge von Statements verändern dürfen, wenn das Ergebnis der Operation davon unberührt ist. Das führt dann aber bei Multithreading-Anwendungen direkt zu Problemen.
    In C++11 wurde zur Lösung solcher Probleme std::atomic eingeführt. Entsprechendes wird auch in C1x kommen mit dem _atomic qualifier -Keyword. Damit können in C und C++ auch float -Operationen auf Compiler-Ebene atomar behandelt werden.

    Neue Anwendungen werden damit möglich, die ich hier nur in Stichworten aufführe: Asynch Agents (active objects), Concurrent collections (parallel STL) , Mutable shared states (transactional memory, lock hierarchies, lock free data structures).

    Weiter ist Michael Wong auf Thread-Local-Storage (TLS) und die Implementierung mit dem neuen Schlüsselwort thread_local eingegangen.
    Auch die neuen Regeln für die Initialisierung von statischen Variablen werden diskutiert. Der neue Standard sieht vor, dass die Initialisierung threadsicher ist, als auch, dass sie nun je Modul parallel erfolgen darf. Weiterhin ist nun eine Abhängigkeit von statischen initialisierten Objekten über Modulgrenzen hinweg nicht mehr erlaubt, weil dies entweder zu Deadlocks oder Data-Races führen kann.

    Extern ClassA e; 
    ClassA v;  // OK
    ClassB u(v); // OK in this TU
    ClassC w(e); // Undefined
    

    Weiter wurde auf „Instruction Reordering“ und „Memory Preftech“ in modernen CPUs eingegangen und was dies für das Programmieren von parallelen Anwendungen bedeutet.

    (Persönliche Anmerkung: Dieser Vortrag hätte aufgrund seiner Komplexität an eine andere Stelle gehört. Ich war zu diesem Zeitpunkt mit Informationen schon so überfüllt, dass ich leider Michael Wongs Ausführungen nur noch mit halben Ohr/Aufmerksamkeit folgen konnte.)

    Fazit

    Das Umfeld der Konferenz war passend und gut organisiert, die Abendveranstaltung ein schöner Bonus.

    Der Einblick in Metro und Windows 8 war neu und interessant für mich. Die Möglichkeiten von C++11 weiter kennen zu lernen ist dringend geraten und manche Sessions haben hier zur Wissensvertiefung führen können. Manche Sessions waren leider etwas dünn.

    Dennoch, die Mischung hat gestimmt. Die Gemeinschaft mit anderen Programmierern und das Diskutieren am Mittagstisch und in den Pausen war angenehm und auch hier eine Möglichkeit, die man zu selten hat.

    Konferenzen in dieser Form sind Weg den eigenen Horizont zu erweitern und das haben wir alle immer wieder nötig.
    Wenn es möglich ist, werde ich auch auf der dritten ADC C++ Konferenz in 2013 dabei sein!

    PS: Es ist nicht auszuschließen, dass ich bei der Wiedergabe einiger Inhalte Fehler gemacht habe. Wenn es technische Fehler in dieser Zusammenfassung gibt sind diese mir zuzuordnen. Ich bitte dies zu entschuldigen, bzw. entsprechende Hinweise zu geben, so dass ich Korrekturen vornehmen kann.



  • Martin schrieb:

    In einem Gespräch danach mit Steve Teixeira bekam ich noch folgende Information: VS-11 Express kann nur noch Metro-Style Apps erzeugen. Diese Express-Version umfasst alle Sprachen in einem Paket. Desktop-Anwendungen und Windows-Console-Anwendungen lassen sich mit diesem Paket nicht mehr erzeugen!

    Wie dann?



  • Nur noch mit den "kaufbaren" Versionen!

    Das ist sehr umstritten (auch bei MS), aber so scheint es nun mal zu werden.

    Ob es irgendwelche Tricks mit SDK nachinstallieren etc. geben wird weiß ich nicht.



  • Klar strich Boris Jabez am Anfang heraus, dass Content alles ist, um das es sich bei Metro und Windows 8 dreht.....very nice 🙂


Anmelden zum Antworten