Entwicklung & Code
Datenparallele Typen in C++26: ein Beispiel aus der Praxis
Nachdem ich in meinem letzten Artikel Neuerungen in C++26: Datenparallele Typen (SIMD) eine theoretische Einführung in das neue Feature von C++ 26 gegeben habe, möchte ich heute mit einem praktischen Beispiel fortfahren.
Rainer Grimm ist seit vielen Jahren als Softwarearchitekt, Team- und Schulungsleiter tätig. Er schreibt gerne Artikel zu den Programmiersprachen C++, Python und Haskell, spricht aber auch gerne und häufig auf Fachkonferenzen. Auf seinem Blog Modernes C++ beschäftigt er sich intensiv mit seiner Leidenschaft C++.
Das folgende Einführungsbeispiel stammt aus der experimentellen Implementierung der SIMD-Bibliothek. Diese Funktionalität wurde unter dem Namen „Data-parallel types (SIMD)“ vollständig in den Entwurf für C++ 26 übernommen. Um das Programm auf den C++ 26-Standard zu portieren, sollte es ausreichen, den Header
durch
und den Namespace std::experimental
durch std::datapar
zu ersetzen.
#include
#include
#include
namespace stdx = std::experimental;
void println(std::string_view name, auto const& a)
{
std::cout << name << „: “;
for (std::size_t i{}; i != std::size(a); ++i)
std::cout << a[i] << ‚ ‘;
std::cout << ‚\n‘;
}
template
stdx::simd my_abs(stdx::simd x)
{
where(x < 0, x) = -x;
return x;
}
int main()
{
const stdx::native_simd a = 1;
println(„a“, a);
const stdx::native_simd b([](int i) { return i - 2; });
println(„b“, b);
const auto c = a + b;
println(„c“, c);
const auto d = my_abs(c);
println(‚d‘, d);
const auto e = d * d;
println(„e“, e);
const auto inner_product = stdx::reduce(e);
std::cout << „inner product: “ << inner_product << ‚\n‘;
const stdx::fixed_size_simd x([](int i) { return i; });
println(„x“, x);
println(„cos²(x) + sin²(x)“, stdx::pow(stdx::cos(x), 2) + stdx::pow(stdx::sin(x), 2));
}
Bevor ich mit dem Programm fortfahre, möchte ich die Ausgabe vorstellen.
Ausgabe des Beispielcodes
(Bild: Screenshot (Rainer Grimm))
Zuerst möchte ich mich den Funktionen println
und my_abs
widmen. println
gibt den Namen und den Inhalt eines SIMD-Vektors aus und durchläuft dabei dessen Elemente. my_abs
berechnet den Absolutwert jedes Elements in einem SIMD-Vektor mit Ganzzahlen und verwendet dabei where
, um negative Werte bedingt zu negieren. Deutlich interessanter ist die main
-Funktion.
Bei dem SIMD-Vektor a wird jedes Element auf 1 gesetzt, hingegen wird bei dem SIMD-Vektor b dank der Lambda-Funktion jedes Element so initialisiert, dass dieses seinen Index minus 2 besitzt. Dabei kommen per Default durch const stdx::native_simd
SSE2-Instruktionen zum Einsatz. Diese SIMD-Vektoren sind 128 Bit groß.
Nun beginnt die Arithmetik. Vektor c ist die elementweise Summe von a und b, d ist der elementweise absolute Wert von c und der Vektor e ist das elementweise Quadrat von d. Zuletzt kommt stdx::reduce(e)
zum Einsatz. Dabei wird der Vektor e auf seine Summe reduziert.
Besonders interessant ist der Ausdruck const stdx::fixed_size_simd
. Durch ihn wird der SIMD-Vektor x mit 16 long-double-Werten von 0 bis 15 initialisiert. Das ist möglich, wenn die Hardware hinreichend modern ist und AVX-252 unterstützt, beispielsweise mit Intels Xeon-Phi- oder AMDs Zen-4-Architektur.
Ähnlich interessant ist die Zeile println("cos²(x) + sin²(x)", stdx::pow(stdx::cos(x), 2) + stdx::pow(stdx::sin(x), 2))
. Sie berechnet cos²(x) + sin²(x)
für jedes Element, was aufgrund der trigonometrischen Identität des Pythagoras für alle Elemente 1 ist. Es gilt, dass alle Funktionen in
außer den speziellen mathematischen Funktionen für simd
überladen sind. Dies sind zum Beispiel die grundlegenden Funktionen wie abs
, min
oder max
. Aber auch zum Beispiel exponentielle, trigonometrische, hyperbolische, Potenz- oder Gamma-Funktionen lassen sich direkt auf SIMD Vektor anwenden.
Nun möchte ich noch auf die Breite des Datentyps simd
genauer eingehen.
Breite von simd
Die Breite des Datentyps native_simd
wird durch die Implementierung zur Compile-Zeit bestimmt. Im Gegensatz dazu gibt der Entwickler die Breite des Datentyps fixed_size_simd
vor.
Das Klassen-Template simd besitzt folgende Deklaration:
template< class T, class Abi = simd_abi::compatible >
class simd;
Dabei steht T für den Elementtyp, der nicht bool
sein kann. Durch den Abi-Tag wird die Anzahl der Elemente und deren Speicher bestimmt.
Zu diesem Klassen-Template gibt es zwei Aliase:
template< class T, int N >
using fixed_size_simd = std::experimental::simd>;
template< class T >
using native_simd = std::experimental::simd>;
Folgende ABI-Tags stehen zur Verfügung:
scalar
: Speicherung eines einzelnen Elementsfixed_size
: Speicherung einer bestimmten Anzahl von Elementencompatible
: gewährleistet ABI-Kompatibilitätnative
: am effizientestenmax_fixed_size
: maximale Anzahl von Elementen, die garantiert vonfixed_size
unterstützt werden
Wie geht’s weiter?
Nach diesem ersten Beispiel zu datenparallelen Typen möchte ich im nächsten Artikel genauer auf deren Funktionalität eingehen.
(rme)
Entwicklung & Code
Software Testing: Qualität ist kein Zufall
In dieser Episode sprechen Richard Seidl und Florian Fieber über den besonderen Anlass, dass Seidl mit dem Deutschen Preis für Softwarequalität ausgezeichnet wurde. Diese Auszeichnung bietet den Rahmen, um über die Rolle des Menschen in der Technologieentwicklung nachzudenken. Richard Seidl teilt seine Sichtweise, dass Qualität weit über Testdaten und Skripte hinausgeht und dass es darum geht, ein Umfeld zu schaffen, in dem Teams Qualität aktiv leben.
Seidl und Fieber diskutieren auch die zukünftigen Herausforderungen und Möglichkeiten, die sich durch die Integration von KI im Bereich Testing ergeben.
„Wenn ein Team wirklich Qualität lebt und nicht nur Testfälle schrubbt, dann ist das ganze Thema auf einem völlig anderen Level angekommen.“ – Richard Seidl
Bei diesem Podcast dreht sich alles um Softwarequalität: Ob Testautomatisierung, Qualität in agilen Projekten, Testdaten oder Testteams – Richard Seidl und seine Gäste schauen sich Dinge an, die mehr Qualität in die Softwareentwicklung bringen.
Die aktuelle Ausgabe ist auch auf Richard Seidls Blog verfügbar: „Qualität ist kein Zufall – Richard Seidl“ und steht auf YouTube bereit.
(mai)
Entwicklung & Code
Apple übernimmt Entwickler des Open Policy Agents
Open Policy Agent (OPA) ist eine Software, die Regeln (formuliert in der Sprache Rego) und Datenobjekte entgegennimmt und auf dieser Grundlage Entscheidungen trifft – Haupteinsatzgebiet sind Autorisierungsregeln, die die Frage beantworten, ob ein Nutzer eine Aktion ausführen darf. Weil OPA Open-Source-Software ist (Apache License 2.0) und vergleichsweise leicht in andere Anwendungen integriert werden kann, erfreut er sich großer Beliebtheit in der Cloud-Native-Community: OPA wird unter anderem genutzt, um über Anfragen ans Kubernetes-API zu entscheiden, trifft in Banken aber auch Entscheidungen, wer welche Anfragen an interne Systeme stellen darf.
Erfunden wurde OPA vom Unternehmen Styra, das mit Zusatzprodukten und Dienstleistungen rund um OPA Geld verdient hat. Auf der Homepage findet man die Logos von Zalando, CapitalOne und dem Europäischen Patentamt. Auch Goldman Sachs und Netflix gehört zu den OPA-Nutzern. Der Code von OPA selbst liegt aber nicht mehr in der Hand von Styra: 2018 wurde OPA als Incubating-Projekt von der CNCF (Cloud Native Computing Foundation) akzeptiert, seit 2021 hat es den höchsten Status „Graduated“ erreicht und hat insgesamt 485 Contributors.
Jetzt steht der nächste Umbruch an: Die Erfinder von Open Policy Agent sowie weitere Mitarbeiter des Unternehmens Styra wechseln den Arbeitgeber: Apple, ebenfalls OPA-Nutzer, übernimmt Styra-CTO Tim Hinrichs und weitere Entwickler. Das hat Hinrichs im OPA-Blog verkündet. „Apple ist ein enthusiastischer OPA-Nutzer, der es als zentrale Komponente seiner Autorisationsinfrastruktur nutzt, um ein großes Portfolio globaler Clouddienste zu verwalten.“
Mehr Open Source
Weil der Code bereits in der Hand der CNCF liegt, ändert sich das Open-Source-Projekt nichts. Der Code bleibt Open Source und wird wie zuvor von der CNCF verwaltet. Auch die Liste der Maintainer soll sich nicht ändern. Neu ist vielmehr, dass Zusatzprodukte aus dem Styra-Portfolio ebenfalls Open Source werden und ins öffentliche Repository umziehen: die kommerzielle OPA-Distribution EOPA, die Verwaltungsoberfläche „OPA Control Plane“, mehrere SDKs sowie der Rego-Linter namens Regal.
Website und Rego-Playground (eine Website, um Rego-Regeln zu testen) sollen wie gewohnt weiterlaufen und auch die Entwicklung soll weitergehen. Unklar hingegen ist, in welcher Form das Unternehmen Styra weiterarbeiten wird. Dazu macht der Blogpost keine Angaben. Große Organisationen, die gehofft haben, bei Styra die Autorisierungsexpertise und Beratung von Tim Hinrichs und den anderen OPA-Kernentwicklern einkaufen zu können, gehen leer aus: Diese Expertise nutzt jetzt Apple.
(jam)
Entwicklung & Code
software-architektur.tv: Netflix ohne Bounded Contexts
In der Softwarearchitektur gilt: Systeme lassen sich besser warten und flexibler gestalten, wenn man sie in mehrere Bounded Contexts aufteilt – und das ist gerade bei Microservices-Systemen entscheidend. Doch nun hat ausgerechnet Netflix, ein Pionier der Microservices-Bewegung, einen Blogpost veröffentlicht, der einen ganz anderen Weg propagiert: „Model Once, Represent Everywhere: UDA (Unified Data Architecture)„.
In dieser Episode nimmt Eberhard Wolff den Ansatz von Netflix genauer unter die Lupe und diskutiert, ob die Zeit gekommen ist, die Idee klar getrennter Bounded Contexts infrage zu stellen – und stattdessen auf ein zentrales Modell zu setzen.
Lisa Maria Schäfer malt dieses Mal keine Sketchnotes.
Livestream am 22. August
Die Ausstrahlung findet live am Freitag, 22. August 2025, 13 bis 14 Uhr statt. Die Folge steht im Anschluss als Aufzeichnung bereit. Während des Livestreams können Interessierte Fragen via Twitch-Chat, YouTube-Chat, Bluesky, Mastodon, Slack-Workspace oder anonym über das Formular auf der Videocast-Seite einbringen.
software-architektur.tv ist ein Videocast von Eberhard Wolff, Blogger sowie Podcaster auf iX und bekannter Softwarearchitekt, der als Head of Architecture bei SWAGLab arbeitet. Seit Juni 2020 sind über 250 Folgen entstanden, die unterschiedliche Bereiche der Softwarearchitektur beleuchten – mal mit Gästen, mal Wolff solo. Seit mittlerweile mehr als zwei Jahren bindet iX (heise Developer) die über YouTube gestreamten Episoden im Online-Channel ein, sodass Zuschauer dem Videocast aus den Heise Medien heraus folgen können.
Weitere Informationen zur Folge finden sich auf der Videocast-Seite.
(mdo)
-
Datenschutz & Sicherheitvor 2 Monaten
Geschichten aus dem DSC-Beirat: Einreisebeschränkungen und Zugriffsschranken
-
Apps & Mobile Entwicklungvor 2 Monaten
Metal Gear Solid Δ: Snake Eater: Ein Multiplayer-Modus für Fans von Versteckenspielen
-
UX/UI & Webdesignvor 4 Tagen
Der ultimative Guide für eine unvergessliche Customer Experience
-
Online Marketing & SEOvor 2 Monaten
TikTok trackt CO₂ von Ads – und Mitarbeitende intern mit Ratings
-
Digital Business & Startupsvor 2 Monaten
10.000 Euro Tickets? Kann man machen – aber nur mit diesem Trick
-
Entwicklung & Codevor 3 Tagen
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
UX/UI & Webdesignvor 2 Monaten
Philip Bürli › PAGE online
-
Social Mediavor 2 Monaten
Aktuelle Trends, Studien und Statistiken