Connect with us

Entwicklung & Code

Datenparallele Typen in C++26: Bedingte Ausführung von Operationen


Leider habe ich in meinem letzten Beitrag „Datenparallele Typen in C++26: ein Beispiel aus der Praxis“ vergessen, eine Funktion der neuen Bibliothek vorzustellen. Das hole ich in diesem Artikel nach.


Rainer Grimm

Rainer Grimm

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 neue Schlüsselwort where erzeugt einen sogenannten Where-Ausdruck. Damit lassen sich die Elemente eines SIMD-Vektors bedingt ansprechen.

Folgendes Beispiel bringt dieses Verhalten auf den Punkt:


// where.cpp

#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; // Set elements where x is negative to their absolute value       
    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);
 
}


In der Funktion my_abs kommt die where-Funktion zum Einsatz: where(x < 0, x) = -x; bewirkt, dass alle Elemente des SIMD-Vektors, die kleiner als Null sind, auf ihren absoluten Wert gesetzt werden.


Beispielcode-Ausgabe

Beispielcode-Ausgabe

Der Screenshot zeigt die Ausgabe des Beispielcodes.

In diesem Fall kommen SSE2-Befehle zum Einsatz. Der SIMD-Vektor ist 128 Bit groß.

Die where-Expression kann mit einem bool-Ausdruck oder einer simd_mask parametrisiert werden.

Obiges Codebeispiel lässt sich auch mit einer simd_mask implementieren. Folgender Code zeigt die Umsetzung:


// whereMask.cpp

#include 
#include 
#include 
namespace stdx = std::experimental;
 
void println(std::string_view name, auto const& a)
{
    std::cout << std::boolalpha << name << ": ";
    for (std::size_t i{}; i != std::size(a); ++i)
        std::cout << a[i] << ' ';
    std::cout << '\n';
}

 
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 stdx::native_simd_mask x = c < 0; 
    println("x", x);

    auto d  = c;
    where(x, d) *= -1; 
    println("d", d);
 
}


Beginnen möchte ich meine Erläuterung mit den letzten fünf Zeilen der Main-Funktion. Zuerst erzeuge ich die simd_mask x, indem das Prädikat c < 0 auf jedes Element des SIMD-Vektors c angewendet wird.

Die Maske x hat die gleiche Länge wie der SIMD- Vektor, besitzt aber nur Wahrheitswerte. Damit diese Wahrheitswerte als true oder false und nicht als 1 oder 0 dargestellt werden, habe ich der Funktion println den Streammanipulator std::boolalpha hinzugefügt.

Zusätzlich muss ich den SIMD-Vektor d mit c initialisieren, da c konstant ist. Nun lässt sich die Expression where(x, d) *= -1; auf d anwenden. Dabei wird jedes Element des SIMD-Vektors negiert, wenn die Maske den Wert true besitzt.


Screenshot Ausgabe des zweiten Codebeispiels

Screenshot Ausgabe des zweiten Codebeispiels

Der Screenshot zeigt die Ausgabe des Codes mit simd_mask.

Der Datentyp simd_mask ist dem Datentyp simd sehr ähnlich. Der wesentliche Unterschied besteht darin, dass simd alle Standard-Ganzzahltypen, Zeichentypen und die Typen float und double annehmen kann. Im Gegensatz dazu unterstützt simd_mask nur Wahrheitswerte.

Die Definition von simd_mask sieht folgendermaßen aus:


template
class basic_simd_mask


Der Abi-Tag bestimmt die Anzahl der Elemente und deren Speicherplatz. Zur Vollständigkeit sind hier noch einmal die ABI-Tags:

  • scalar: Speichern eines einzelnen Elements
  • fixed_size: Speichern einer bestimmten Anzahl von Elementen
  • compatible: gewährleistet ABI-Kompatibilität
  • native: am effizientesten
  • max_fixed_size: maximale Anzahl von Elementen, die von fixed_size garantiert unterstützt werden

Entsprechend zu simd besitzt simd_mask auch zwei Aliase:


template< size_t Bytes, int N >
using fixed_size_simd_mask = simd_mask>

template< size_t Bytes >
using native_simd_mask = simd_mask>


In meinem vorerst letzten Artikel über data-parallel types möchte ich auf die besonderen Funktionen dafür eingehen.


(rme)



Source link

Weiterlesen
Kommentar schreiben

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Entwicklung & Code

Die Produktwerker: Das Scrum Guide Expansion Pack aus Sicht von Product Ownern


Der Scrum Guide selbst ist seit 2020 unverändert – aber rund um Jeff Sutherland ist nun das Scrum Guide Expansion Pack erschienen. Dominique Winter spricht in dieser Folge mit Oliver Winter darüber, was dieses neue Dokument für Product Owner bedeutet – und was davon hilfreich sein kann.


Product Owner Days, Konferenz in Köln, 2. und 3. April 2025

Product Owner Days, Konferenz in Köln, 2. und 3. April 2025

(Bild: deagreez/123rf.com)

So geht Produktmanagement: Auf der Online-Konferenz Product Owner Day von dpunkt.verlag und iX am 13. November 2025 können Product Owner, Produktmanagerinnen und Service Request Manager ihren Methodenkoffer erweitern, sich vernetzen und von den Good Practices anderer Unternehmen inspirieren lassen.

Denn das Expansion Pack bringt einiges mit, unter anderem:

  • neue Rollen wie die des „Stakeholders“ oder „Supporters“
  • explizite Erwähnung, dass das Scrum-Team für die Product Discovery verantwortlich ist
  • einen stärkeren Fokus auf Outcome statt nur Output

Besonders spannend: Discovery wird im Expansion Pack als expliziter Teil von Scrum verstanden. Das bringt viele Teams näher an ihre gelebte Realität: Entscheidungen auf Basis von echten Erkenntnissen, nicht bloß basierend auf Annahmen oder Feature-Wünschen außerhalb des Teams.

Auch die Rolle des Product Owners wird geschärft: Weg vom reinen Backlog-Verwalter, hin zur echten Produktverantwortung – mit strategischem Denken, Marktverständnis und Führungskompetenz auf Augenhöhe.

Doch es gibt auch kritische Punkte: Die neue Trennung zwischen „Output Done“ und „Outcome Done“ wird sicher irritieren – und auch die neue Supporter-Rolle wirft Fragen auf. Nicht jede zusätzliche Erklärung ist automatisch ein Fortschritt. Und nicht jede Ergänzung passt in jeden Kontext.

Dominique Winter und Oliver Winter nehmen das Expansion Pack auseinander – konstruktiv, praxisnah und mit Blick auf echte Herausforderungen im Alltag von Product Ownern. Ihre Empfehlung: Nicht als neue Anleitung verstehen, sondern als Impuls, um die eigene Praxis zu reflektieren und weiterzuentwickeln.

Außerdem werfen sie einen Blick auf das Kapitel zu künstlicher Intelligenz im Scrum-Kontext – und diskutieren, wo hier Potenzial steckt (und wo eher Wunschdenken).

Die aktuelle Ausgabe des Podcasts steht auch im Blog der Produktwerker bereit: „Scrum Guide Expansion Pack aus Sicht von Product Owner„.


(mai)



Source link

Weiterlesen

Entwicklung & Code

Visual Studio Code 1.102 bringt neue Features für Copilot Chat und MCP-Support


Microsofts freier Sourcecode-Editor Visual Studio Code hat in Version 1.102 einige Neuerungen zu bieten. Das Juni-Release bringt zusätzliche Funktionen für den KI-basierten GitHub Copilot Chat, allgemeinen Support für das Model Context Protocol (MCP) und Updates für die Barrierefreiheit.

Kürzlich hat Microsoft verkündet, seine KI-Funktionen für Visual Studio Code (VS Code) quelloffen verfügbar zu machen. Im Rahmen dessen hat das Unternehmen bereits die Copilot-Chat-Erweiterung Open Source gestellt. In diesem Release von VS Code stehen außerdem neue Funktionen bereit.

Neben den vordefinierten Chatmodi „Ask“, „Edit“ und „Agent“ können Entwicklerinnen und Entwickler seit dem letzten Release als Preview eigene Modi mit spezifischen Anweisungen und einem Set erlaubter Tools erstellen, nach denen sich das Large Language Model (LLM) richten soll. Nun können sie auch festlegen, welches Sprachmodell für den Chatmodus eingesetzt werden soll, indem sie die model-Metdateneigenschaft zur Datei chatmode.md hinzufügen und den Model Identifier angeben. Die Modellinfos sind mithilfe des Autovervollständigungs-Tools IntelliSense verfügbar.


Auswahl des gewünschten LLM im benutzerdefinierten Chatmodus

Auswahl des gewünschten LLM im benutzerdefinierten Chatmodus

Auswahl des gewünschten LLM im benutzerdefinierten Chatmodus

(Bild: Microsoft)

Daneben bietet der Editor für Chatmodi, Prompts und Anweisungsdateien nun Vervollständigung, Validierung und Hovern für alle unterstützten Metadateneigenschaften. Das Einstellungs-Icon Configure Chat in der Chat-View-Toolbar erlaubt das Verwalten benutzerdefinierter Modi sowie wiederverwendbarer Anweisungen, Prompts und Toolsets:


In der Toolbar der Chat-Ansicht erscheint das Icon "Configure Chat".

In der Toolbar der Chat-Ansicht erscheint das Icon "Configure Chat".

In der Toolbar der Chat-Ansicht erscheint das Icon „Configure Chat“.

(Bild: Microsoft)

Die Auswahl von Modes zeigt dabei alle aktuell installierten benutzerdefinierten Modi und ermöglicht das Öffnen, Erstellen oder Löschen eines Modus. Zahlreiche weitere Updates zum Copilot Chat lassen sich im Ankündigungsbeitrag der neuen VS-Code-Version einsehen.

Der Support für das Model Context Protocol ist nun in VS Code allgemein verfügbar. Mit diesem Standard, der KI-Modellen die Interaktion mit externen Tools und Services durch ein einheitliches Interface erlaubt, lässt sich der in VS Code verfügbare Agent Mode erweitern – etwa um eine Anbindung an Datenbanken oder um das Aufrufen von APIs. Zudem können Unternehmen nun die Verfügbarkeit von MCP-Servern mithilfe einer GitHub-Copilot-Richtlinie kontrollieren.

Um direkt loszulegen, stellt das VS-Code-Team eine kuratierte Liste beliebter MCP-Server für den Agent Mode bereit.

Regelmäßig führt VS Code neue Features ein, die die Barrierefreiheit verbessern sollen. In diesem Release sind drei entsprechende Neuerungen an Bord:

Der Befehl Keep All Edits zum Annehmen aller Änderungen lässt sich auch dann ausführen, während der Fokus auf dem Editor liegt. Bisher musste dafür der Fokus auf der Chatansicht liegen. Bei einem Rendering-Fehler im Chat werden Screenreader-User nun benachrichtigt und können diese Information mittels Keyboard fokussieren, und wenn der Chat eine User-Aktion benötigt, ertönt ein akustisches Signal.

Weitere Details zum Juni-Update VS Code 1.102 lassen sich dem Ankündigungsbeitrag entnehmen. Ebenfalls aktualisiert wurden die VS-Code-Erweiterungen für Python, Pylance and Jupyter, wie ein dedizierter Blogeintrag informiert.


(mai)



Source link

Weiterlesen

Entwicklung & Code

Event-Driven, Teil 3: Wie man über Ereignisse spricht


Im zweiten Teil dieser Serie haben wir gesehen, welche Bausteine eine Event-getriebene Architektur ausmachen: Commands, Events, Projections und Event Streams. Dabei spielen Events eine zentrale Rolle – sie sind die Sprache, in der das System erzählt, was passiert ist.


the next big thing – Golo Roden

the next big thing – Golo Roden

Golo Roden ist Gründer und CTO von the native web GmbH. Er beschäftigt sich mit der Konzeption und Entwicklung von Web- und Cloud-Anwendungen sowie -APIs, mit einem Schwerpunkt auf Event-getriebenen und Service-basierten verteilten Architekturen. Sein Leitsatz lautet, dass Softwareentwicklung kein Selbstzweck ist, sondern immer einer zugrundeliegenden Fachlichkeit folgen muss.

Doch was genau ist ein Event eigentlich? Wie benennt man es? Und wie stellt man sicher, dass es fachlich sinnvoll, verständlich und nützlich ist?

Ein Event beschreibt etwas, das in der Vergangenheit liegt und fachlich bedeutsam ist. Es geht nicht um technische Details („Request empfangen“ oder „Datenbankverbindung geöffnet“), sondern um Fakten, die für die Domäne relevant sind: „Buch wurde ausgeliehen“, „Mahngebühr wurde berechnet“ oder „Adresse wurde umgemeldet“.

Diese Ereignisse sind die kleinste gemeinsame Sprache zwischen Fachlichkeit und Technik. Sie dokumentieren Entscheidungen, Abläufe und Zustandsänderungen – nicht als Nachgedanke, sondern als primäres Modell.

Events sollten so formuliert sein, dass sie auch (beziehungsweise vor allem) von Fachleuten verstanden werden und – im Idealfall – wurden sie sogar gemeinsam mit ihnen entwickelt. Es geht darum, eine gemeinsame Sprache zu finden, die sowohl die Business-Perspektive als auch die technische Umsetzung trägt.

Ein gutes Event erfüllt folgende Kriterien:

  • Es beschreibt eine Tatsache, keine Absicht, keinen Wunsch, keine Prognose.
  • Es ist aus Sicht der Domäne verständlich und nachvollziehbar.
  • Es benennt, was passiert ist, und nicht, wie es implementiert wurde.

Beispiel:

  • Nicht „book created“, sondern „Buch wurde in den Bestand aufgenommen“.
  • Nicht „book updated“, sondern „Buch wurde verliehen“.

Events sind keine Logzeilen, keine Debug-Ausgaben und keine reinen Transportformate. Sie bilden tatsächlich den fachlichen Kern dessen, was das System ausdrücken soll. Man kann sich ein Event daher wie einen Eintrag in einem Geschäftsbuch vorstellen – etwas, das dauerhaft dokumentiert, was geschehen ist, und auf dessen Basis Entscheidungen getroffen werden.

Wer Events als rein technische Hilfsmittel betrachtet, läuft Gefahr, ihre Bedeutung zu verwässern. Stattdessen sollten Events präzise benannt und stabil gehalten werden – denn sie bilden die langfristige Wahrheit des Systems.

Events sind in der Regel unveränderlich. Sie werden erzeugt, gespeichert und danach nicht mehr verändert. Das bedeutet: Ein einmal veröffentlichtes Event ist Teil der Historie und muss als solches erhalten bleiben. Wenn sich Anforderungen ändern, sollte man nicht bereits vorhandene Events „anpassen“, sondern ergänzende Events einführen.

Diese Stabilität erlaubt es, Projections zu rekonstruieren, Prozesse zu debuggen und neue Anforderungen auf Basis der bestehenden Historie umzusetzen – zum Beispiel durch das Nachverarbeiten alter Events mit neuer Logik.

Wenn ein Event entstanden ist, kann es nicht nur im eigenen System genutzt werden – sondern auch veröffentlicht werden. Oft geschieht das über eine Message Queue oder einen Event Bus. Dadurch können andere Teile des Systems (oder andere Systeme) darauf reagieren, ohne dass es eine direkte Kopplung gibt.

Das bedeutet: Events sind nicht nur Daten – sie sind ein Vertrag. Ein Versprechen, dass ein bestimmter Zustand eingetreten ist – und dass man sich darauf verlassen kann.

Im nächsten Teil schauen wir uns an, was Event-getriebene Architektur wirklich bedeutet – und was häufig damit verwechselt wird. Denn nicht überall, wo Events draufstehen, ist auch Event-getriebene Architektur drin.


(mai)



Source link

Weiterlesen

Beliebt