Blog

Hardware-sensitive Synthese in der Classiq-Plattform

27
Dezember
,
2023
Israel Reichental

Einführung

In der klassischen Datenverarbeitung sind die physikalischen Aspekte der Speicherverwaltung entscheidend für die Leistung der Software. Die meisten Entwickler von Algorithmen kümmern sich jedoch nicht um solche Überlegungen und konzentrieren sich auf eine einfache Programmierung. Diese Einfachheit ist möglich, weil optimierte Bibliotheken und automatisierte Werkzeuge, die dem Industriestandard entsprechen, die Last für die meisten Anwendungsfälle ausreichend tragen. Es ist daher wünschenswert, dass die Entwicklung von Quantenalgorithmen in ähnlicher Weise profitiert. Auch wenn die Quantencomputer noch in den Kinderschuhen stecken, können wir anfangen, analog zu denken. Und wie? Indem wir die folgenden beiden Komponenten berücksichtigen: Quanten-Hilfs-Cubits (Ancilla-Qubits), die Zwischenberechnungen vorübergehend speichern, und die Konnektivität zwischen Qubits, eine physikalische Eigenschaft des Speichers. In diesem Blog-Beitrag wird erklärt, wie sie zusammenhängen, und diese Beziehung wird mit Hilfe der Classiq-Plattform zur Automatisierung der Optimierung untersucht.

Übersicht 

Als Dmitri Maslov vorschlug, Toffoli-Gatter mit relativer Phase zu verwenden, um eine neue Implementierung für mehrfach kontrollierte Quantengatter zu konstruieren, zeigte er die Vorteile seiner Methode durch den Vergleich von Metriken auf logischer Ebene mit anderen Implementierungen. In dem Papier heißt es jedoch, dass diese Metriken "das Konnektivitätsmuster der Qubits" nicht berücksichtigen. Tatsächlich erstreckt sich der physikalische Raum nur über drei Dimensionen, und jedes Qubit kann nicht auf skalierbare Weise mit jedem anderen Qubit innerhalb eines endlich-dimensionalen Raums verbunden werden". Maslov, ein Experte für die Entwicklung von Quantenalgorithmen, ist sich der Anforderungen bewusst, die die Hardware stellt. Hier werden wir die Classiq-Plattform nutzen, um Maslovs Bemerkung zu untersuchen und ein Beispiel für die Auswirkung der Qubit-Konnektivität auf mehrfach kontrollierte Gatter zu präsentieren.

Wir werden kurz die mehrfach gesteuerten Operationen erklären und die Implementierungen der Classiq-Bibliothek diskutieren. Als Nächstes gehen wir auf die Hardware-Konnektivität und ihre Einschränkungen beim Entwurf von Quantenschaltungen auf Gatterebene ein. Abschließend demonstrieren wir die Fähigkeiten der Classiq-Synthese-Engine, verschiedene Implementierungen entsprechend der Hardware-Konnektivität auszuwählen. Diese Anpassung ist ein Beispiel für das Co-Design von Quantenschaltungen, bei dem Low-Level-Informationen aus der Hardware das Schaltungsdesign auf der logischen Ebene bestimmen.

Multi-kontrollierte Quantenoperationen

Multikontrollierte Quantenoperationen dienen als Baustein für kanonische Quantenalgorithmen wie die Grover-Operationen und arithmetische Operationen. Der Einfachheit halber werden wir uns auf mehrfach kontrollierte NICHT-Operationen (MCX) konzentrieren. Jede beliebige mehrfach kontrollierte Quantenoperation kann in der Tat mit MCX-Gattern und einer einfach kontrollierten Quantenoperation geschrieben werden (versuchen Sie dies als einfache Übung).

Abgesehen von Maslovs Implementierung wurden im Laufe der Jahre verschiedene MCX-Gatter vorgeschlagen und sind in der Literatur und in Open-Source-Bibliotheken wie Qiskit und TKet zu finden. Ein gemeinsames Muster unter diesen ist der Kompromiss zwischen der Anzahl der Hilfs-Qubits und der Schaltungstiefe und der Anzahl der kontrollierten Gatter (seltene Beispiele erfordern stattdessen exponentiell präzise Gatter (siehe hier), was hier der Einfachheit halber vermieden wird). 

Was sind Hilfsquantenbits? Sie dienen als temporärer Speicher bei der Quantenberechnung - sie werden zu Beginn zugewiesen und am Ende wieder in ihren Ausgangszustand zurückversetzt (nicht berechnet). Hilfsqubits können notwendig sein, wenn sie andere Rechenressourcen reduzieren. Beispielsweise beeinträchtigen die Tiefe der Schaltung und die Anzahl der CX-Gatter die Qualität des Programms aufgrund des daraus resultierenden Verlusts an Genauigkeit, insbesondere bei verrauschten Quantengeräten.

Die Classiq-Bibliothek kombiniert verschiedene Implementierungen (dies verdient einen separaten Blog-Beitrag), um eine Serie zu konstruieren, die mit diesem Kompromiss spielt. Die Synthese-Engine wählt die Implementierung entsprechend den vom Benutzer angegebenen Einschränkungen aus. 

Hardware-Konnektivität

Wenn wir ein klassisches Programm entwerfen, berücksichtigen wir in der Regel nicht das physische Gerät, auf dem die Software läuft. Dieser Teil wird hinter den Kulissen durch automatisierte Zwischen- und Low-Level-Optimierungen erledigt und nur von Experten weiter abgestimmt. Ein wichtiger Aspekt ist der Overhead, der durch die physische Kommunikation zwischen dem Prozessor (CPU) und den verschiedenen Speichergeräten entsteht: Der On-Chip-Speicher (Cache) ist kleiner, aber näher an der CPU, während der Hauptspeicher, der Random Access Memory (RAM), weiter entfernt ist. Daher ist die Cache-Nutzung entscheidend für die Leistung des Programms und hat manchmal mehr Gewicht als die Minimierung der Anzahl der Rechenoperationen. Beispiele, die sich mit diesem Problem befassen, sind algorithmische Implementierungen für Matrixoperationen, Kompiliervorgänge wie das Blockieren und Abrollen von Schleifen und Überlegungen zur Zuweisung von Speicher auf dem Stack bzw. auf dem Heap.

Können wir ein Quantenanalogon finden? Während Quantencomputer für komplexe Speicherarchitekturen verfrüht sind, können wir die Hilfs-Qubits als Speicher betrachten. Um diese Analogie näher zu erläutern, müssen wir das Konzept des Routing als Teil des Kompilierungsprozesses diskutieren.

Bei vielen Quantencomputerarchitekturen (wie supraleitenden Qubits) sind die Qubits nicht direkt miteinander verbunden. Nachfolgend ist zum Beispiel das Konnektivitätsdiagramm eines IBM Eagle-Prozessors aus der Classiq-Plattform dargestellt. Dieses Diagramm besteht aus vertikal gestapelten Reihen von 14-15 Qubits, die über abwechselnde 4-Qubit-Schichten miteinander verbunden sind.

Nehmen wir nun an, dass die Gatter der logischen Schaltung (z. B. CX) zwischen zwei nicht benachbarten Qubits liegen, wie die beiden blau markierten. Um die Gatteroperation durchzuführen, führen wir SWAP-Gatter entlang eines ausgewählten Pfades ein, der diese Qubits verbindet, um die Information zum Ziel-Qubit zu leiten. 

Die SWAP-Gate-Operation ist teuer: Jedes SWAP-Gate erfordert drei CX-Gates! Daher ist die Optimierung der Routing-Stufe für eine gegebene logische Schaltung extrem wichtig für die Leistung. Leider ist die Routing-Optimierung ein NP-schweres Problem, so dass wir die Anzahl der CX-Gatter in der kompilierten Schaltung nicht im Voraus berechnen können. Es wurden einige heuristische Routing-Algorithmen entwickelt, die in der Literatur und in Open-Source-Bibliotheken verfügbar sind.

Hardware-gestützte Synthese mit Classiq

Nun können wir die folgende Frage stellen: Kann es aufgrund des Routings zu einer abnehmenden Rendite bei der Verwendung von Hilfsqubits kommen? Genauer gesagt, wird eine Implementierung eines MCX-Gatters mit Hilfsqubits, die darauf abzielt, die Anzahl der CX-Gatter so weit wie möglich zu reduzieren, immer noch als die optimalste Implementierung für Hardware angesehen, die nicht vollständig angeschlossen ist, oder wird der Routing-Overhead die Verwendung von Hilfsqubits überflüssig machen?

Um diese Frage zu beantworten, bitten wir die Classiq-Synthese-Engine, ein MCX-Gatter mit 30 Kontroll-Qubits zu konstruieren. Wir stimmen die Basisgatter auf CX und U ab und optimieren die Anzahl der CX-Gatter. Sie können es selbst ausprobieren:

  • Zunächst synthetisieren wir für die All-zu-All-Verbindung.
    Wie erwartet, wählt die Maschine eine Maslov-ähnliche Implementierung mit der maximalen Anzahl von Hilfsqubits. Die resultierende Schaltung benötigt 45 Qubits: 31 funktionale Qubits, aufgeteilt in 30 Kontroll-Qubits und ein einziges Ziel-Qubit, und 14 Hilfs-Qubits. 
  • Dann generieren wir dasselbe MCX-Gatter für eine Schaltung mit einem 1-D-Nächste-Nachbarn-Verbindungsmuster von 50 Qubits.
    Die resultierende Schaltung auf logischer Ebene benötigt jetzt nur noch 42 Qubits. Die Verwendung von zu vielen Hilfskomponenten führt zu einem Routing-Overhead, der größer ist als der Gewinn, der durch die temporäre Speicherung der Quantenberechnungen erzielt wird.

Anmerkung 1: Im zweiten Fall stellen die 42 Qubits die Schaltung auf logischer Ebene dar. Die Anzahl der Qubits kann sich nach Anwendung des Routing-Algorithmus erhöhen. Der entscheidende Unterschied ist hier, dass die Implementierung auf logischer Ebene geändert wird, was zu einer besseren Schaltung führt, wenn Classiq verwendet wird.
Anmerkung 2: Dies ist nicht das letzte Wort, und wir könnten in Zukunft bessere Implementierungen finden. Darüber hinaus können auch andere Überlegungen, wie z. B. die während des Prozesses vorgenommenen Optimierungen auf Gate-Ebene, die endgültige Schaltung beeinflussen. Nichtsdestotrotz verdeutlicht dieses Beispiel die abnehmende Rendite, wenn zu viele Hilfsschaltungen hinzugefügt werden. 

Als Herausforderung können Sie versuchen, dieses Verhalten mit echter Hardware-Konnektivität anstelle von 1-D Nearest Neighbor zu reproduzieren. Es ist nicht einfach, ein solches Beispiel für die derzeit verfügbaren Architekturen zu finden. Dennoch wird es wahrscheinlich immer relevanter, je komplexer sie werden, insbesondere wenn man Multicore-Architekturen in Betracht zieht. Fallen Ihnen andere Quantenbausteine ein, bei denen ein Kompromiss zwischen Qubit- und CX-Anzahl besteht?

Schlussfolgerung

Beim Entwurf von Quantenalgorithmen ist es wichtig, die Hardwareeigenschaften in die Leistungsüberlegungen einzubeziehen. Der Einsatz der Classiq-Synthese-Engine ermöglicht es den Entwicklern, ihre Bemühungen auf die algorithmische Struktur des Modells zu lenken, anstatt sich mit den Feinheiten der Optimierungen auf Gatterebene zu befassen. Der Bedarf an automatisierten Werkzeugen wie Classiq wird nur zunehmen, wenn sich Quantenschaltungen zu kommerzieller Komplexität entwickeln und viele Bausteine enthalten, die jeweils hardwareabhängige Kompromisse aufweisen. Einen Überblick über Classiqs Synthese-Engine finden Sie in den Teilen I und II.

Abschließend sei gesagt, dass die Qubit-Konnektivität nur eine von vielen möglichen Einschränkungen ist, die den Einsatz von Codesign zur Leistungsverbesserung inspirieren können. So kann man beispielsweise CX-Schichten in einer Schaltung anpassen, um eine bessere Fehlerbegrenzung zu erreichen (siehe hier). Andere Anwendungsfälle könnten die Einschränkungen der klassischen Kontrolle über die Qubits berücksichtigen.

Einführung

In der klassischen Datenverarbeitung sind die physikalischen Aspekte der Speicherverwaltung entscheidend für die Leistung der Software. Die meisten Entwickler von Algorithmen kümmern sich jedoch nicht um solche Überlegungen und konzentrieren sich auf eine einfache Programmierung. Diese Einfachheit ist möglich, weil optimierte Bibliotheken und automatisierte Werkzeuge, die dem Industriestandard entsprechen, die Last für die meisten Anwendungsfälle ausreichend tragen. Es ist daher wünschenswert, dass die Entwicklung von Quantenalgorithmen in ähnlicher Weise profitiert. Auch wenn die Quantencomputer noch in den Kinderschuhen stecken, können wir anfangen, analog zu denken. Und wie? Indem wir die folgenden beiden Komponenten berücksichtigen: Quanten-Hilfs-Cubits (Ancilla-Qubits), die Zwischenberechnungen vorübergehend speichern, und die Konnektivität zwischen Qubits, eine physikalische Eigenschaft des Speichers. In diesem Blog-Beitrag wird erklärt, wie sie zusammenhängen, und diese Beziehung wird mit Hilfe der Classiq-Plattform zur Automatisierung der Optimierung untersucht.

Übersicht 

Als Dmitri Maslov vorschlug, Toffoli-Gatter mit relativer Phase zu verwenden, um eine neue Implementierung für mehrfach kontrollierte Quantengatter zu konstruieren, zeigte er die Vorteile seiner Methode durch den Vergleich von Metriken auf logischer Ebene mit anderen Implementierungen. In dem Papier heißt es jedoch, dass diese Metriken "das Konnektivitätsmuster der Qubits" nicht berücksichtigen. Tatsächlich erstreckt sich der physikalische Raum nur über drei Dimensionen, und jedes Qubit kann nicht auf skalierbare Weise mit jedem anderen Qubit innerhalb eines endlich-dimensionalen Raums verbunden werden". Maslov, ein Experte für die Entwicklung von Quantenalgorithmen, ist sich der Anforderungen bewusst, die die Hardware stellt. Hier werden wir die Classiq-Plattform nutzen, um Maslovs Bemerkung zu untersuchen und ein Beispiel für die Auswirkung der Qubit-Konnektivität auf mehrfach kontrollierte Gatter zu präsentieren.

Wir werden kurz die mehrfach gesteuerten Operationen erklären und die Implementierungen der Classiq-Bibliothek diskutieren. Als Nächstes gehen wir auf die Hardware-Konnektivität und ihre Einschränkungen beim Entwurf von Quantenschaltungen auf Gatterebene ein. Abschließend demonstrieren wir die Fähigkeiten der Classiq-Synthese-Engine, verschiedene Implementierungen entsprechend der Hardware-Konnektivität auszuwählen. Diese Anpassung ist ein Beispiel für das Co-Design von Quantenschaltungen, bei dem Low-Level-Informationen aus der Hardware das Schaltungsdesign auf der logischen Ebene bestimmen.

Multi-kontrollierte Quantenoperationen

Multikontrollierte Quantenoperationen dienen als Baustein für kanonische Quantenalgorithmen wie die Grover-Operationen und arithmetische Operationen. Der Einfachheit halber werden wir uns auf mehrfach kontrollierte NICHT-Operationen (MCX) konzentrieren. Jede beliebige mehrfach kontrollierte Quantenoperation kann in der Tat mit MCX-Gattern und einer einfach kontrollierten Quantenoperation geschrieben werden (versuchen Sie dies als einfache Übung).

Abgesehen von Maslovs Implementierung wurden im Laufe der Jahre verschiedene MCX-Gatter vorgeschlagen und sind in der Literatur und in Open-Source-Bibliotheken wie Qiskit und TKet zu finden. Ein gemeinsames Muster unter diesen ist der Kompromiss zwischen der Anzahl der Hilfs-Qubits und der Schaltungstiefe und der Anzahl der kontrollierten Gatter (seltene Beispiele erfordern stattdessen exponentiell präzise Gatter (siehe hier), was hier der Einfachheit halber vermieden wird). 

Was sind Hilfsquantenbits? Sie dienen als temporärer Speicher bei der Quantenberechnung - sie werden zu Beginn zugewiesen und am Ende wieder in ihren Ausgangszustand zurückversetzt (nicht berechnet). Hilfsqubits können notwendig sein, wenn sie andere Rechenressourcen reduzieren. Beispielsweise beeinträchtigen die Tiefe der Schaltung und die Anzahl der CX-Gatter die Qualität des Programms aufgrund des daraus resultierenden Verlusts an Genauigkeit, insbesondere bei verrauschten Quantengeräten.

Die Classiq-Bibliothek kombiniert verschiedene Implementierungen (dies verdient einen separaten Blog-Beitrag), um eine Serie zu konstruieren, die mit diesem Kompromiss spielt. Die Synthese-Engine wählt die Implementierung entsprechend den vom Benutzer angegebenen Einschränkungen aus. 

Hardware-Konnektivität

Wenn wir ein klassisches Programm entwerfen, berücksichtigen wir in der Regel nicht das physische Gerät, auf dem die Software läuft. Dieser Teil wird hinter den Kulissen durch automatisierte Zwischen- und Low-Level-Optimierungen erledigt und nur von Experten weiter abgestimmt. Ein wichtiger Aspekt ist der Overhead, der durch die physische Kommunikation zwischen dem Prozessor (CPU) und den verschiedenen Speichergeräten entsteht: Der On-Chip-Speicher (Cache) ist kleiner, aber näher an der CPU, während der Hauptspeicher, der Random Access Memory (RAM), weiter entfernt ist. Daher ist die Cache-Nutzung entscheidend für die Leistung des Programms und hat manchmal mehr Gewicht als die Minimierung der Anzahl der Rechenoperationen. Beispiele, die sich mit diesem Problem befassen, sind algorithmische Implementierungen für Matrixoperationen, Kompiliervorgänge wie das Blockieren und Abrollen von Schleifen und Überlegungen zur Zuweisung von Speicher auf dem Stack bzw. auf dem Heap.

Können wir ein Quantenanalogon finden? Während Quantencomputer für komplexe Speicherarchitekturen verfrüht sind, können wir die Hilfs-Qubits als Speicher betrachten. Um diese Analogie näher zu erläutern, müssen wir das Konzept des Routing als Teil des Kompilierungsprozesses diskutieren.

Bei vielen Quantencomputerarchitekturen (wie supraleitenden Qubits) sind die Qubits nicht direkt miteinander verbunden. Nachfolgend ist zum Beispiel das Konnektivitätsdiagramm eines IBM Eagle-Prozessors aus der Classiq-Plattform dargestellt. Dieses Diagramm besteht aus vertikal gestapelten Reihen von 14-15 Qubits, die über abwechselnde 4-Qubit-Schichten miteinander verbunden sind.

Nehmen wir nun an, dass die Gatter der logischen Schaltung (z. B. CX) zwischen zwei nicht benachbarten Qubits liegen, wie die beiden blau markierten. Um die Gatteroperation durchzuführen, führen wir SWAP-Gatter entlang eines ausgewählten Pfades ein, der diese Qubits verbindet, um die Information zum Ziel-Qubit zu leiten. 

Die SWAP-Gate-Operation ist teuer: Jedes SWAP-Gate erfordert drei CX-Gates! Daher ist die Optimierung der Routing-Stufe für eine gegebene logische Schaltung extrem wichtig für die Leistung. Leider ist die Routing-Optimierung ein NP-schweres Problem, so dass wir die Anzahl der CX-Gatter in der kompilierten Schaltung nicht im Voraus berechnen können. Es wurden einige heuristische Routing-Algorithmen entwickelt, die in der Literatur und in Open-Source-Bibliotheken verfügbar sind.

Hardware-gestützte Synthese mit Classiq

Nun können wir die folgende Frage stellen: Kann es aufgrund des Routings zu einer abnehmenden Rendite bei der Verwendung von Hilfsqubits kommen? Genauer gesagt, wird eine Implementierung eines MCX-Gatters mit Hilfsqubits, die darauf abzielt, die Anzahl der CX-Gatter so weit wie möglich zu reduzieren, immer noch als die optimalste Implementierung für Hardware angesehen, die nicht vollständig angeschlossen ist, oder wird der Routing-Overhead die Verwendung von Hilfsqubits überflüssig machen?

Um diese Frage zu beantworten, bitten wir die Classiq-Synthese-Engine, ein MCX-Gatter mit 30 Kontroll-Qubits zu konstruieren. Wir stimmen die Basisgatter auf CX und U ab und optimieren die Anzahl der CX-Gatter. Sie können es selbst ausprobieren:

  • Zunächst synthetisieren wir für die All-zu-All-Verbindung.
    Wie erwartet, wählt die Maschine eine Maslov-ähnliche Implementierung mit der maximalen Anzahl von Hilfsqubits. Die resultierende Schaltung benötigt 45 Qubits: 31 funktionale Qubits, aufgeteilt in 30 Kontroll-Qubits und ein einziges Ziel-Qubit, und 14 Hilfs-Qubits. 
  • Dann generieren wir dasselbe MCX-Gatter für eine Schaltung mit einem 1-D-Nächste-Nachbarn-Verbindungsmuster von 50 Qubits.
    Die resultierende Schaltung auf logischer Ebene benötigt jetzt nur noch 42 Qubits. Die Verwendung von zu vielen Hilfskomponenten führt zu einem Routing-Overhead, der größer ist als der Gewinn, der durch die temporäre Speicherung der Quantenberechnungen erzielt wird.

Anmerkung 1: Im zweiten Fall stellen die 42 Qubits die Schaltung auf logischer Ebene dar. Die Anzahl der Qubits kann sich nach Anwendung des Routing-Algorithmus erhöhen. Der entscheidende Unterschied ist hier, dass die Implementierung auf logischer Ebene geändert wird, was zu einer besseren Schaltung führt, wenn Classiq verwendet wird.
Anmerkung 2: Dies ist nicht das letzte Wort, und wir könnten in Zukunft bessere Implementierungen finden. Darüber hinaus können auch andere Überlegungen, wie z. B. die während des Prozesses vorgenommenen Optimierungen auf Gate-Ebene, die endgültige Schaltung beeinflussen. Nichtsdestotrotz verdeutlicht dieses Beispiel die abnehmende Rendite, wenn zu viele Hilfsschaltungen hinzugefügt werden. 

Als Herausforderung können Sie versuchen, dieses Verhalten mit echter Hardware-Konnektivität anstelle von 1-D Nearest Neighbor zu reproduzieren. Es ist nicht einfach, ein solches Beispiel für die derzeit verfügbaren Architekturen zu finden. Dennoch wird es wahrscheinlich immer relevanter, je komplexer sie werden, insbesondere wenn man Multicore-Architekturen in Betracht zieht. Fallen Ihnen andere Quantenbausteine ein, bei denen ein Kompromiss zwischen Qubit- und CX-Anzahl besteht?

Schlussfolgerung

Beim Entwurf von Quantenalgorithmen ist es wichtig, die Hardwareeigenschaften in die Leistungsüberlegungen einzubeziehen. Der Einsatz der Classiq-Synthese-Engine ermöglicht es den Entwicklern, ihre Bemühungen auf die algorithmische Struktur des Modells zu lenken, anstatt sich mit den Feinheiten der Optimierungen auf Gatterebene zu befassen. Der Bedarf an automatisierten Werkzeugen wie Classiq wird nur zunehmen, wenn sich Quantenschaltungen zu kommerzieller Komplexität entwickeln und viele Bausteine enthalten, die jeweils hardwareabhängige Kompromisse aufweisen. Einen Überblick über Classiqs Synthese-Engine finden Sie in den Teilen I und II.

Abschließend sei gesagt, dass die Qubit-Konnektivität nur eine von vielen möglichen Einschränkungen ist, die den Einsatz von Codesign zur Leistungsverbesserung inspirieren können. So kann man beispielsweise CX-Schichten in einer Schaltung anpassen, um eine bessere Fehlerbegrenzung zu erreichen (siehe hier). Andere Anwendungsfälle könnten die Einschränkungen der klassischen Kontrolle über die Qubits berücksichtigen.

Über "Der Podcast des Qubit-Typen"

Der Podcast wird von The Qubit Guy (Yuval Boger, unser Chief Marketing Officer) moderiert. In ihm diskutieren Vordenker der Quanteninformatik über geschäftliche und technische Fragen, die das Ökosystem der Quanteninformatik betreffen. Unsere Gäste geben interessante Einblicke in Quantencomputer-Software und -Algorithmen, Quantencomputer-Hardware, Schlüsselanwendungen für Quantencomputer, Marktstudien der Quantenindustrie und vieles mehr.

Wenn Sie einen Gast für den Podcast vorschlagen möchten, kontaktieren Sie uns bitte .

Siehe auch

Keine Artikel gefunden.

Erstellen Sie Quantensoftware ohne Grenzen 

Kontakt