OpenCL im Handel - Seite 8

 

36. Führe Anweisungen auf dem CPU-Datenpfad aus



36. Führe Anweisungen auf dem CPU-Datenpfad aus

Das Video erklärt anhand eines Beispiels für die Durchführung von Akkumulationsoperationen, wie Berechnungen auf einem CPU-Datenpfad ausgeführt werden. Der Datenpfad enthält Lade- und Speichereinheiten zum Laden und Speichern von Daten in den Speicher unter Verwendung von Adressen und Funktionseinheiten wie ALUs zum Ausführen von Operationen. Das Video veranschaulicht den Prozess Schritt für Schritt, einschließlich des Ladens von Daten aus dem Speicher, des Ausführens von Operationen und des Zurückspeicherns der Ergebnisse in den Speicher. Der Referent erklärt auch, wie FPGA verwendet werden kann, um dieselbe Funktion zu implementieren und die verfügbaren Ressourcen in der Hardware optimal zu nutzen.

  • 00:00:00 In diesem Abschnitt erklärt das Video anhand eines Beispiels für die Durchführung von Akkumulationsoperationen, wie Berechnungen auf einem PGA abgebildet werden. Zunächst wird High-Level-Code mit CPU-Befehlen in Assemblersprache umgewandelt und Zwischenwerte in Registern gespeichert. Die CPU ist eine Pipeline-CPU mit Funktionseinheiten im Datenpfad, einschließlich Lade- und Speichereinheiten zum Laden und Speichern von Daten im Speicher unter Verwendung von Adressen. Der Datenpfad ist allgemein genug ausgelegt, um alle Arten von Befehlen innerhalb einer festen Datenbreite und Anzahl von Operationen auszuführen, und ein konstanter Wert kann über die ALU in ein Register geladen werden. Das Video zeigt auch beispielhaft, wie sechs Befehle in der CPU ausgeführt werden, und veranschaulicht den Prozess Schritt für Schritt.

  • 00:05:00 In diesem Abschnitt geht der Sprecher durch mehrere Anweisungen und erklärt, wie sie in einem CPU-Datenpfad ausgeführt werden, einschließlich des Ladens von Daten aus dem Speicher in Registerdateien, wobei verschiedene Funktionseinheiten im Datenpfad verwendet werden, um Operationen wie Multiplikation und Addition durchzuführen , und Speichern der Ergebnisse zurück in den Speicher. Der Redner erklärt dann, wie FPGA verwendet werden kann, um dieselbe Kernelfunktion zu implementieren, indem die CPU-Hardware entrollt und die genauen Ressourcen verwendet werden, die für die Funktion erforderlich sind, wodurch die verfügbaren Ressourcen in der FPGA-Hardware optimal genutzt werden.
 

37. Angepasster Datenpfad auf FPGA


37. Angepasster Datenpfad auf FPGA

Das Video erläutert die Verwendung eines FPGA zur Implementierung der Kernel-Funktion für eine verbesserte Leistung durch Entrollen der CPU-Hardware und Anpassen des Datenpfads auf dem FPGA. Durch Entfernen ungenutzter Einheiten, Laden von Konstanten und Verbindungen und Umplanen einiger Operationen können Ladeoperationen gleichzeitig ausgeführt werden, um die Leistung zu steigern. Das Design angepasster Datenpfade kann den Durchsatz verbessern, die Latenz und den Stromverbrauch reduzieren, indem notwendige Operationen und Daten für eine bestimmte Funktion ausgewählt werden. Das Video zeigt ein Beispiel für eine bedarfsgerechte Addition auf zwei Vektoren, wobei das Ergebnis mithilfe von Registern zwischen den Stufen wieder im Speicher gespeichert wird, um eine effiziente Pipeline und den Start von acht Arbeitselementen für aufeinanderfolgende Additionen zu ermöglichen.

  • 00:00:00 In diesem Abschnitt wird das Konzept der Verwendung von FPGA zur Implementierung der Kernelfunktion mit verbesserter Leistung und Ressourcennutzung erläutert. Die Idee besteht darin, die CPU-Hardware zu entrollen und FPGA-Ressourcen zu verwenden, um das Design zu erstellen, das die erforderliche Funktion implementiert, während die Ressourcen verwendet werden, die nicht in jedem Ausführungsschritt verwendet werden. Durch Entfernen bestimmter ungenutzter Einheiten, Ladekonstanten und Leitungen und Umplanen einiger Operationen können die Ladeoperationen gleichzeitig ausgeführt werden, wodurch die Leistung erhöht wird. Das Anpassen des Datenpfads auf dem FPGA kann das gleiche Ergebnis erzielen, indem spezialisierte dedizierte Ressourcen verwendet werden.

  • 00:05:00 In diesem Abschnitt erörtert der Referent das Design eines benutzerdefinierten Datenpfads auf FPGA, indem er die erforderlichen Operationen und Daten für eine bestimmte Funktion, Speichergröße und Konfiguration so auswählt, dass der Durchsatz verbessert, die Latenz reduziert und der Stromverbrauch reduziert werden können Verbrauch, unter Verwendung einer Kernel-Funktion, die eine nachfrageweise Addition an zwei Vektoren durchführt, wobei das Ergebnis wieder im Speicher gespeichert wird. Durch die Nutzung der Register zwischen den Stufen kann der Datenpfad eine effiziente Pipeline verwenden und acht Arbeitselemente für aufeinanderfolgende Hinzufügungen starten, sodass jeder Zyklus verschiedene Threads verarbeiten kann, um Leerlaufeinheiten zu vermeiden.
 

38. OpenCL für FPGA und Data Parallel Kernel



38. OpenCL für FPGA und Data Parallel Kernel

Das Video erklärt, wie OpenCL es FPGA-Ingenieuren ermöglicht, Software-Engineering-Ressourcen zu nutzen, um die Anzahl der FPGA-Anwendungsentwickler zu erweitern, indem sie die parallelen Rechenressourcen auf FPGAs nutzen. Das Programmiermodell von OpenCL ermöglicht die Spezifikation von Parallelität durch die Verwendung von Datenparallelfunktionen, die als Kernel bezeichnet werden, und jeder Kernel verlässt sich auf Kennungen, die durch „Get Global ID“ angegeben werden, um parallele Berechnungen an unabhängigen Datensegmenten durchzuführen. Das Konzept von Threads und Arbeitsgruppen wird eingeführt, bei dem Threads auf verschiedene Teile des Datensatzes zugreifen, die in Arbeitsgruppen unterteilt sind, wobei nur Threads innerhalb derselben Arbeitsgruppe lokalen Speicher gemeinsam nutzen können. Mit diesem Programmiermodell ermöglicht OpenCL eine effiziente Datenparallelverarbeitung.

  • 00:00:00 In diesem Abschnitt stellt der Referent OpenCL und seine Bedeutung beim Entwerfen von FPGA-basierten Anwendungen vor. Obwohl es weniger Programmierer für FPGA als für Standard-CPUs gibt, erweitert OpenCL als High-Level-Programmiersprache die Zahl der FPGA-Anwendungsentwickler, indem es FPGA-Ingenieuren ermöglicht, Software-Engineering-Ressourcen zu nutzen, um die parallelen Rechenressourcen auf FPGAs zu nutzen. OpenCL ist ein Industriestandard für heterogenes Computing und ermöglicht Programmierern die Verwendung vertrauter C- oder C++-APIs zum Schreiben von Programmen zur Ausführung komplexer Workloads mit Hardwarebeschleunigern wie Mehrkernprozessoren, GPUs und FPGAs. Die große Idee hinter OpenCL ist sein Ausführungsmodell, mit dem Parallelität explizit angegeben werden kann.

  • 00:05:00 In diesem Abschnitt wird das Programmiermodell von OpenCL für FPGA und Data Parallel Kernel erklärt. Das Video beschreibt die Struktur eines OpenCL-Frameworks mit einem Host und einem Beschleuniger oder Gerät, die auf separaten Hardwaredomänen ausgeführt werden. Der Host bereitet die Geräte und Kernel vor und erstellt Befehle, die für die Übermittlung an diese Geräte erforderlich sind. Der Beschleunigercode ist in OpenCLC geschrieben, und der Host kommuniziert mit ihm über eine Reihe von OpenCL-API-Aufrufen, wodurch eine Abstraktion der Kommunikation zwischen einem Host-Prozessor und auf dem Gerät ausgeführten Kerneln ermöglicht wird. OpenCL-Kernel sind datenparallele Funktionen, die verwendet werden, um mehrere parallele Ausführungs-Threads zu definieren, die sich jeweils auf Kennungen stützen, die durch „Get Global ID“ angegeben werden. Diese IDs spezifizieren die Segmente oder Partitionen von Daten, an denen ein Kernel arbeiten soll, wodurch parallele Berechnungen an unabhängigen Datenpaaren durchgeführt werden können.

  • 00:10:00 In diesem Abschnitt wird das Konzept von Threads und Arbeitsgruppen eingeführt, wobei Threads auf verschiedene Teile des Datensatzes zugreifen können und in Arbeitsgruppen partitioniert sind. Nur Threads innerhalb derselben Arbeitsgruppe können lokalen Speicher gemeinsam nutzen. Jeder Thread hat eine lokale und eine globale ID, und die globale ID kann anhand der Gruppen-ID und der lokalen Größe berechnet werden. Dieses System ermöglicht eine effiziente Datenparallelverarbeitung.
 

39. Hostseitige OpenCL-Programmierung: Kontext, Warteschlangen, Speicherobjekte usw.



39. Hostseitige OpenCL-Programmierung: Kontext, Warteschlangen, Speicherobjekte usw.

Dieses Video-Tutorial untersucht verschiedene hostseitige Programmierkonzepte in OpenCL mit Schwerpunkt auf Kontext, Warteschlangen und Speicherobjekten. Es behandelt die beiden neuen APIs in OpenCL, clCreateKernelsInProgram und clSetKernelArg, die verwendet werden, um Kernel-Objekte zu erstellen und Argumente an Kernel-Funktionen zu übergeben. Das Tutorial erläutert auch die Verwendung der clCreateImage-API zum Erstellen von Bildobjekten und wie Bildpixel mithilfe der Kanalreihenfolge und des Kanaltyps im Speicher gespeichert werden. Es erklärt, wie OpenCL mit 2D- und 3D-Bildern umgeht, wie Entwickler Informationen über Speicherobjekte mithilfe von APIs wie clGetMemoryObjectInfo sammeln können und wie Speicherobjektoperationen wie Lesen und Schreiben von Pufferaufzeichnungen, Zuordnen von Speicherobjekten und Kopieren von Daten zwischen Speicherobjekten ausgeführt werden.

  • 00:00:00 In diesem Abschnitt werden die hostseitigen Programmierkonzepte von OpenCL erneut aufgegriffen. Der Abschnitt konzentriert sich auf Kontext, Warteschlangen und Speicherobjekte. Mehrere Kontexte können auf einer physischen Plattform erstellt werden, selbst wenn sie aus Geräten verschiedener Anbieter besteht. Speicherobjekte im globalen Speicher können von mehreren Warteschlangen gemeinsam genutzt werden, aber eine geeignete Synchronisation muss von der Anwendung auf der Hostseite durchgeführt werden. Innerhalb eines Kontexts können mehrere Kontexte und mehrere Befehlswarteschlangen vorhanden sein. Die verschiedenen von Anbietern bereitgestellten OpenCL-Plattformen sind nicht unbedingt kompatibel und können daher nicht in denselben Kontext gestellt werden.

  • 00:05:00 In diesem Abschnitt behandelt das Video zwei neue APIs in OpenCL. Die erste API ermöglicht die Erstellung von Kerneln für jede Funktion in einem OpenCL-Programm mithilfe der Funktion clCreateKernelsInProgram. Dadurch wird ein Array von Kernel-Objekten erstellt, die verwendet werden können, um Kernel-Funktionsnamen und andere zugehörige Informationen mit der Funktion clGetKernelInfo zu überprüfen. Die zweite API, clSetKernelArg, wird verwendet, um Kernel-Argumente zu instanziieren und nimmt das Kernel-Objekt und den Index des Arguments als Argumente. Das Video erklärt weiter, wie diese APIs verwendet werden und wie Kernel-Objekte nach der Verwendung freigegeben werden.

  • 00:10:00 In diesem Abschnitt lernen wir, wie die API Argumentwerte an Kernelfunktionen übergeben kann. Wir können einen primitiven Datentyp als Zeiger auf die Kernel-Funktion übergeben, oder wir können einen Zeiger auf ein Speicherobjekt oder ein Beispielobjekt mit komplexen Daten übergeben. Bildobjekte sind eine spezielle Art von Speicherobjekten, die zum Halten von Pixeldaten verwendet werden. Wir können Bildobjekte mit denselben Konfigurationsflags wie Pufferobjekte und mit Formaten erstellen, die aus einer Liste von Bildformaten definiert sind. Die clCreateImage-API wird verwendet, um Bildobjekte zu erstellen, und ihre Parameter ähneln denen, die zum Erstellen von Pufferobjekten verwendet werden. Das dritte Argument identifiziert die Formateigenschaften der zuzuweisenden Bilddaten, während das vierte Argument den Typ und die Abmessungen des Bildes beschreibt.

  • 00:15:00 In diesem Abschnitt wird die Verwendung der clCreateImage()-API eingeführt, um zu identifizieren, wie Bildpixel im Speicher gespeichert werden. Das Bildobjektformat dient zum Speichern eines Bildes im Speicher und besteht aus zwei Faktoren: Kanalreihenfolge und Kanaltyp. Die Kanalreihenfolge identifiziert, wie Kanalinformationen für jedes Pixel gespeichert werden, und ist ein Aufzählungstyp, der Grundfarben und Alpha-Informationen enthält. Im Gegensatz dazu gibt der Kanaltyp an, wie Bildkanäle binär codiert werden, und verwendet unterschiedliche Werte, um die Darstellung der Farbinformationen zu bestimmen. Bitebenen sind wesentlich, um anzugeben, wie viele Bits verwendet werden sollen, um den Farbwert im Kanal darzustellen. Darüber hinaus wird das Speicherlayout von Bildformaten demonstriert, so dass für jedes Pixel die RGBA-Sequenz im Speicher gespeichert wird, wobei ein Byte verwendet wird, um die Farbinformationen für jeden Farbkanal zu codieren.

  • 00:20:00 In diesem Abschnitt erläutert das Video, wie OpenCL mit 2D- und 3D-Bildern umgeht, die aus mehreren Schichten bestehen können, die in einer anderen Dimension übereinander gestapelt sind. Der CL-Bilddeskriptor wird verwendet, um zu beschreiben, wie die Bildobjekte angeordnet sind, und enthält Parameter wie die Bildbreite, -höhe und -tiefe in Pixeln sowie den Abtastzeilenabstand in Bytes. Darüber hinaus wird die clCreateImage()-API verwendet, um die Anzahl der Bytes zu identifizieren, die zum Beschreiben des Bilds erforderlich sind, was möglicherweise Anpassungen für das Auffüllen und die Ausrichtung innerhalb der Zeilen und Slices erfordert.

  • 00:25:00 In diesem Abschnitt erläutert der Referent, wie Informationen über Bild- und Speicherobjekte in OpenCL mithilfe von APIs wie clGetImageInfo und clGetMemoryObjectInfo gesammelt werden. Diese APIs ermöglichen es Entwicklern, Informationen über Dinge wie Bildformat, Pixelgröße, Pixelbreite, Pixelhöhe, Tiefe und andere Eigenschaften von Speicherobjekten zu erhalten. Darüber hinaus können sie EnqueueReadBuffer/EnqueueWriteBuffer verwenden, um Daten in Pufferobjekte zu lesen oder zu schreiben, und EnqueueReadImage/EnqueueWriteImage, um auf Bildobjektdaten zuzugreifen. Die Verwendung von Ursprung, Region, Reihenabstand und Scheibenabstand ist auch spezifisch für Bildobjekte, die in Form von Reihen, Scheiben und Bildern organisiert sind. Entwickler können diese APIs verwenden, um den genauen Standort einer Region anzugeben, auf die sie zugreifen oder einen Kopiervorgang ausführen möchten, und um Ereignisse mithilfe von CL-Ereignisargumenten zu generieren.

  • 00:30:00 In diesem Abschnitt erklärt das Video zwei Speicherobjektoperationen in OpenCL: Lesen und Schreiben von Buffer Rec und Mapping von Speicherobjekten. Mit Read and Write Buffer Rec gibt der Benutzer den Ursprung und die Größeninformationen an, sodass Daten an bestimmten Stellen abgerufen oder geschrieben werden können. Das Zuordnen von Speicherobjekten ermöglicht das Zuordnen eines Speicherobjekts auf einem Gerät zu einem Speicherbereich auf dem Host. Nach der Zuordnung können Speicherobjekte auf der Hostseite gelesen und modifiziert werden, indem Zeiger verwendet werden, die durch Speicherzuordnungs-APIs erhalten werden. Das Video geht auch durch eine Liste von Speicherobjektvorgängen, die in OpenCL verfügbar sind, um Daten zwischen Speicherobjekten zu kopieren, die Programmierung auf der Hostseite zu vereinfachen und die Leistung von Lese- und Schreibvorgängen zu verbessern.

  • 00:35:00 In diesem Abschnitt erörtert der Referent die verschiedenen Speicherobjekte in OpenCL und wie sie zum Kopieren von Daten von einem Ort zum anderen verwendet werden können. Die Kopierfunktionen umfassen Kopierpuffer, Kopierbild, Kopierpuffer rechteckig und so weiter. Der Referent zeigt ein Host-Gerät-System und demonstriert, wie Daten von einem Puffer in einen anderen kopiert werden, indem die Funktion „CL in Queue Copy Buffer“ verwendet wird. Sie erklären, wie man den Puffer mit cl enqueu map buffer einem Speicherplatz zuordnet und dann mit memory copy den abgebildeten Bereich auf sich selbst kopiert.
 

40. HDL-Entwurfsfluss für FPGA



40. HDL-Entwurfsfluss für FPGA

Dieses Video erklärt den Entwicklungsprozess von Field Programmable Gate Arrays (FPGAs) mit der Designsoftware Quartus.

Die Designmethodik und Softwaretools für die FPGA-Entwicklung werden erläutert. Der typische Entwurfsablauf für programmierbare Logik beginnt mit einer Entwurfsspezifikation, geht weiter zur RTL-Codierung und dann zur RTL-Funktionssimulation, auf die dann eine Synthese folgt, um das Design in gerätespezifische Grundelemente zu übersetzen. Ingenieure ordnen diese Grundelemente dann bestimmten Stellen innerhalb eines bestimmten FPGAs zu und verifizieren die Leistungsspezifikationen durch Timing-Analyse. Schließlich wird das Design in eine FPGA-Karte geladen und Debugging-Tools können verwendet werden, um es auf Hardware zu testen. Für Intel FPGAs wird die Quartus-Designsoftware verwendet, um den Designablauf durchzuführen, beginnend mit einer Systembeschreibung und weiter zu Logiksynthese, Platzierung und Route, Timing- und Leistungsanalyse und Programmierung des Designs in die eigentlichen FPGAs.

 

41. OpenCL-Datentypen und Gerätespeicher



41. OpenCL-Datentypen und Gerätespeicher

Das Video behandelt OpenCL-Datentypen und Gerätespeicher. Es behandelt boolesche, ganzzahlige und Gleitkommatypen und erläutert spezifische Datentypen, die verwendet werden, um mit Speicheradressen zu arbeiten, wie z. B. int-ptr, uint-ptr und ptrdiff-t. Außerdem werden Vektordatentypen erläutert, bei denen es sich um Arrays handelt, die mehrere Elemente desselben Typs enthalten, mit denen Operatoren gleichzeitig auf alle Elemente angewendet werden können, und wie sie verwendet werden. Das Video bietet verschiedene Beispiele für die Initialisierung und den Zugriff auf Elemente in einem Vektor, einschließlich der Verwendung von Buchstaben und numerischen Indizes, hoch-niedrig und gerade-ungerade. Es erklärt auch die Speicherausrichtung und die Verwendung von Set-Kernel-Argumenten und privaten Kernel-Argumenten.

  • 00:00:00 In diesem Abschnitt bietet das Video einen Überblick über die Datentypen, die in der OpenCL-Kernelprogrammierung verwendet werden können, einschließlich boolescher, ganzzahliger und Gleitkommatypen. Bestimmte Datentypen wie int-ptr, uint-ptr und ptrdiff-t werden verwendet, um mit Speicheradressen zu arbeiten. Das Video weist darauf hin, dass der doppelte Typ nur unterstützt wird, wenn das Zielgerät die Erweiterung CL Cronus 14-point-64 CLCronus FP 64 unterstützt. Entwickler können diese Erweiterung überprüfen, bevor sie den Double-Typ in ihren OpenCL-Kernel-Programmen verwenden. Das Video erklärt auch, wie man die Double-Type-Erweiterung aktiviert und in einem Kernel-Programm verwendet.

  • 00:05:00 In diesem Abschnitt des Videos werden die OpenCL-Datentypen und der Gerätespeicher besprochen. Der OpenCL-Standard schreibt die Endian-Reihenfolge für Datentypen nicht vor. Little-Endian und Big-Endian sind die beiden optionalen Endian-Typen, die davon abhängen, wie eine Computerarchitektur definiert, wie multiplizierte Variablen im Speicher gespeichert werden. Die Endian-Ordnungen eines Geräts können mit dem Datentyp CR get device info vector ermittelt werden. Darüber hinaus wurden Vektordatentypen als Arrays eingeführt, die mehrere Elemente desselben Typs enthalten, eine feste Länge haben und die gleichzeitige Anwendung von Operatoren auf jedes Element ermöglichen. Die Vorteile der Verwendung von Vektordatentypen bestehen darin, dass sie schneller und einfacher sind als die Verwendung von Arrays. Das Video erklärt, wie Sie Vektordatentypen verwenden, um eine elementweise Addition für mehrere Arrays durchzuführen.

  • 00:10:00 In diesem Abschnitt lernen wir verschiedene Vektortypen kennen, die in OpenCL verwendet werden können und Skalartypen sehr ähnlich sind. Vektoren benötigen jedoch am Ende eine Zahl, die angibt, wie groß der Vektor ist und welche Art von Elementen er enthält. OpenCL hat auch zwei spezielle Datentypen, den doppelten und den halben Datentyp, die vom Gerät möglicherweise unterstützt werden oder nicht. Um die bevorzugte Vektorgröße für verschiedene Typen zu kennen, stellt OpenCL eine API bereit, mit der die bevorzugte Vektorbreite eines Geräts abgefragt werden kann. Auf dieser Grundlage können wir Optionen zum Erstellen unseres Programms festlegen, z. B. einen Fließkommavektor für eine bevorzugte Größe von 128 definieren oder einen Fließkommawert von 8 definieren, wenn die bevorzugte Vektorgröße 256 ist. Vektoren können initialisiert werden, indem ihnen Anfangswerte zugewiesen werden Klammern. Wir können sogar einen Vektor mit kleineren Vektoren initialisieren, wenn wir beispielsweise zwei Vektoren der Größe zwei haben, A und B, die beide mit skalaren Werten initialisiert sind.

  • 00:15:00 In diesem Abschnitt erklärt der Referent, wie Elemente oder Komponenten in einem OpenCL-Vektor initialisiert und aufgerufen werden. Benutzer können einen Vektor mit kleineren Vektoren, einer Kombination aus Skalaren und kleineren Faktoren oder durch direktes Zuweisen der Werte zu Vektorelementen initialisieren. Es werden Beispiele bereitgestellt, die zeigen, wie Nummernindizierung, Buchstabenindizierung und hoch-niedrig gerade-ungerade verwendet werden, um auf Elemente im Vektor zuzugreifen. Verschiedene Beispiele zeigen, wie Teilmengen von Elementen aus einem Vektor abgerufen und diese Elemente anderen Variablen zugewiesen werden.

  • 00:20:00 In diesem Abschnitt erörtert der Referent verschiedene Methoden zum Indizieren und Ändern von Vektorelementen, einschließlich der Verwendung numerischer Indizes, Buchstaben (wie X, Y, Z und W) zur Darstellung der verschiedenen Dimensionen eines Vektors und Kombinationen von Buchstaben und numerischen Indizes. Sie erklären auch, wie man hoch-niedrig und gerade-ungerade verwendet, um eine Teilmenge von Vektorkomponenten basierend auf ihrer Position im Vektor auszuwählen. Diese Indizierungs- und Modifikationsmethoden können nützlich sein, um mit Vektoren unterschiedlicher Länge und Dimensionen zu arbeiten.

  • 00:25:00 In diesem Abschnitt lernen wir verschiedene Methoden für den Zugriff auf und die Änderung von Elementen in einem Vektor kennen, wie z -indizierte Elemente. Wir untersuchen auch, wie Vektoren in einem Little-Endian-Gerät gespeichert werden, bei dem das niedrigstwertige Byte einer Ganzzahl an einer niedrigeren Adresse gespeichert wird als das höchstwertige Byte. Dies bedeutet, dass in einem Vektor aus vorzeichenlosen Ganzzahlen die vier Bytes jedes 32-Bit-Ganzzahlwerts in der Reihenfolge vom niederwertigsten zum höchstwertigen Byte gespeichert werden, wobei jedes vollständige Element des Vektors 16 Byte belegt.

  • 00:30:00 In diesem Abschnitt erläutert der Referent, wie OpenCL-Datentypen und Gerätespeicher in Little-Endian- und Big-Endian-Geräten gespeichert werden. Sie zeigen, wie ein vierelementiger Vektor vom Typ vorzeichenlose Ganzzahl auf beiden Gerätetypen im Speicher gespeichert wird, wobei darauf hingewiesen wird, dass die Reihenfolge der Bytes aufgrund der Art und Weise, wie Little-Endian- und Big-Endian-Geräte die niedrigstwertigen und höchstwertigen speichern, unterschiedlich ist Byte. Der Redner demonstriert auch eine Kernel-Funktion namens "Vektorbytes", die einzelne Bytes aus diesem Speicher mithilfe von Zeigern abruft.

  • 00:35:00 In diesem Abschnitt wird das Konzept der Speicherausrichtung in OpenCL-Datentypen besprochen. Es wird erklärt, dass sich der Speicher typischerweise an 32-Bit-Strukturen wie Ganzzahlen und Gleitkommazahlen ausrichtet, die immer an Speicheradressen gespeichert werden, die ein Vielfaches von vier sind. Es wird auch darauf hingewiesen, dass 64-Bit-Strukturen wie long und double an Adressen gespeichert werden, die ein Vielfaches von acht sind, und die kleinste Zweierpotenz größer oder gleich der Datengröße die Speicherausrichtung der Datenstruktur festlegt. Außerdem wird der Prozess der Initialisierung lokaler und privater Kernel-Argumente in OpenCL besprochen und erklärt, dass Kernel-Argumente in lokalen und privaten Bereichen mit SetKernelArg konfiguriert werden können, aber der letzte Parameterwert nicht gesetzt werden kann, wenn der Bezeichner lokal ist. Darüber hinaus wird angemerkt, dass private Kernelargumente einfache Primitive sein müssen, wie z. B. ganze Zahlen und Gleitkommazahlen.

  • 00:40:00 In diesem Abschnitt erläutert das Video, wie Sie festgelegte Kernel-Argumente und private Kernel-Argumente in Ihrem OpenCL-Programm verwenden. Bei Verwendung von Set Kernel Argument sollte das erste Argument der Index der ganzzahligen Größe des Arguments sein, gefolgt von einem Zeiger auf die Variable. Private Kernel-Argumente können auch Vektoren sein, wie z. B. ein Array von Float Four, das nur in Kernel-Funktionen verwendet und mit set Kernel-Argument übergeben werden kann.
 

42. Relationale OpenCL-Vektoroperationen



42. Relationale OpenCL-Vektoroperationen

Das Video behandelt die OpenCL-Kernel-Programmierung und ihre Operatoren und integrierten Funktionen. Der Fokus liegt auf Vergleichsoperatoren und wie sie mit Skalar- und Vektorwerten arbeiten. Eine beispielhafte Kernelfunktion, "op test", wird vorgestellt, die eine elementweise UND-Operation zwischen einer Konstante und einem privaten Vektor durchführt. Das Video erklärt, wie Sie einen Vektor mit relationalen Operationen in OpenCL implementieren, indem Sie bestimmte Vektorelemente mithilfe logischer Operationen mit einem Skalar vergleichen. Der resultierende Vektor kann in einer While-Schleife verwendet werden, um einen endgültigen Ausgabevektor zu erstellen, der dem Ausgabespeicherobjekt zugewiesen wird.

  • 00:00:00 In diesem Abschnitt führt das Video in die OpenCL-Kernelprogrammierung ein und erörtert die Operatoren und integrierten Funktionen, die die Sprache von anderen Hochsprachen geerbt hat. Die vorgestellten Operatoren umfassen Arithmetik, Vergleich und Logik, bitweise und ternäre Auswahl. Der Abschnitt konzentriert sich insbesondere auf Vergleichsoperatoren und erklärt, wie sie sowohl mit skalaren als auch mit Vektorwerten arbeiten. Das Segment stellt auch eine beispielhafte Kernelfunktion namens "op test" bereit, die den relationalen Operator verwendet, um eine elementweise UND-Operation zwischen einem konstanten Vektor und einem privaten Vektor auszuführen, der mit Anfangswerten initialisiert wurde.

  • 00:05:00 In diesem Abschnitt erklärt der Referent, wie ein Vektor mit relationalen Operationen in OpenCL implementiert werden kann. Am Beispiel des Vergleichs bestimmter Elemente eines Vektors mit einem Skalarwert durch logische Operationen zeigt der Referent, wie ein resultierender Vektor mit wahren und falschen Werten erstellt werden kann, die als -1 bzw. 0 dargestellt werden. Der resultierende Vektor kann dann in einer While-Schleife verwendet werden, in der die einzelnen Elemente weiteren logischen Operationen unterzogen werden, um einen endgültigen Ausgangsvektor zu erzeugen, der dem Ausgangsspeicherobjekt zugewiesen wird.
 

43. Integrierte OpenCL-Funktionen: vloadn, select



43. Integrierte OpenCL-Funktionen: vloadn, select

Das Video behandelt zwei wichtige integrierte OpenCL-Funktionen: vloadn und select. Vloadn ermöglicht es Ihnen, Stapel mit Werten aus einem skalaren Array zu initialisieren und nimmt zwei Argumente entgegen: Offset und einen Zeiger auf das skalare Array. Mit Auswählen hingegen können Sie bestimmte Elemente aus zwei Stapeln auswählen und diese zum Erstellen eines neuen Vektors verwenden. Es kann ganzzahlige Werte mit oder ohne Vorzeichen enthalten, und nur das höchstwertige Bit in den Maskenelementen zählt. Das Tutorial zeigt, wie diese Funktionen in der Praxis funktionieren.

  • 00:00:00 In diesem Abschnitt lernen wir etwas über Vloadn, eine eingebaute Funktion, die zum Initialisieren von Stapeln mit Werten aus einem skalaren Array verwendet wird. Vloadn akzeptiert zwei Argumente: Offset und einen Zeiger auf das skalare Array. Offset bestimmt, welche Elemente des Arrays in den Stapel platziert werden, angegeben in Bezug auf die Größe des Vektors. Außerdem lernen wir die Select-Funktion kennen, mit der bestimmte Elemente aus zwei Stapeln ausgewählt und daraus ein neuer Vektor erstellt werden kann. Es kann ganzzahlige Werte mit oder ohne Vorzeichen enthalten, und nur das höchstwertige Bit in den Maskenelementen zählt. Die höchstwertigen Bits einer Maskenkomponente in Select bestimmen, welcher Stapel für das entsprechende Element im Ausgabevektor verwendet werden soll.

  • 00:05:00 In diesem Abschnitt behandelt das Tutorial zwei integrierte OpenCL-Funktionen: vloadn und select. Vloadn wird verwendet, um Elemente aus einem angegebenen Vektor in einen neuen Vektor zu laden, und select wird verwendet, um Elemente entweder aus der ersten oder der zweiten Eingabe basierend auf einer Maske auszuwählen. Das Tutorial bietet Beispiele dafür, wie diese Funktionen in der Praxis funktionieren, darunter, wie vloadn Werte aus dem ersten Eingabevektor basierend auf der Maske auswählt und wie select funktioniert, um Bits aus dem ersten oder zweiten Eingabevektor auszuwählen.
 

44. Einführung in DPC++



44. Einführung in DPC++

Dieses Video stellt DPC++ vor, eine Hochsprache für parallele Datenprogrammierung, die komplexe Berechnungen an Beschleuniger wie FPGAs und GPUs auslagert und Teil des OneAPI-Frameworks ist. DPC++ zielt darauf ab, datenparallele Workloads mithilfe von modernem C++ und architekturorientierter Leistungsoptimierung zu beschleunigen. Der Dozent stellt ein einfaches DPC++-Beispiel vor, das demonstriert, wie man Datenverwaltungsvariablen deklariert und eine Kernel-Funktion auf einem Gerät mit einem Befehl und Accessor ausführt. Das Video erklärt auch, wie die Lambda-Funktion Argumente und Referenzen von den außerhalb deklarierten Variablen übernehmen kann.

  • 00:00:00 In diesem Abschnitt führt der Dozent in die DPC++-Programmierung ein, eine Hochsprache für die Datenparallelprogrammierung, die komplexe Berechnungen auf Beschleuniger wie FPGAs und GPUs auslagert. DPC++ verwendet modernes C++ und zielt darauf ab, datenparallele Workloads zu beschleunigen, indem Algorithmen analysiert, Aufgaben oder Daten zerlegt und architekturorientierte Leistungsoptimierung verwendet werden. DPC++ ist Teil des OneAPI-Frameworks und sein Ziel ist es, die Programmierung mit einer einzigen Sprache zu ermöglichen, die auf beliebigen CPUs, FPGAs oder GPUs ausgeführt werden kann. Der Dozent stellt dann ein einfaches DPC++-Beispiel zur Verfügung, das Variablen, einen Puffer und eine Gerätewarteschlange für die Datenverwaltung deklariert.

  • 00:05:00 In diesem Abschnitt stellt der Sprecher ein Beispiel eines DPC++-Programms vor, das einen Befehl und eine Lambda-Funktion erstellt, um eine Kernel-Funktion zu definieren, die auf dem Gerät ausgeführt wird. Das Programm verwendet einen Zugriffsmechanismus, um dem Befehl einen Puffer zuzuordnen, und einen weiteren Zugriffsmechanismus, um auf das Ergebnis zuzugreifen. Schließlich enthält das Programm eine for-Schleife, um mit dem Ergebnis-Accessor auf den Inhalt im Puffer zuzugreifen und ihn auszugeben. Die Lambda-Funktion kann verschiedene Möglichkeiten haben, Argumente in die Funktion zu übernehmen, z. B. das Übergeben von Verweisen auf die außerhalb der Funktion deklarierten Variablen.
 

45. Wie kann man parallel denken?



45. Wie kann man parallel denken?

Das Video lehrt die parallele Programmierung am Beispiel der Matrixmultiplikation. Es hebt die Parallelität in dieser Berechnung hervor, bei der mehrere Zeilen und Spalten unabhängig voneinander berechnet werden können. Die Implementierung einer Einzelelementberechnung in Matrix C wird unter Verwendung einer Kernfunktion gezeigt, die eine parallele Berechnung ermöglicht. Die Verwendung von Accessoren, Bereich und parallelen Kernel-Funktionen wird im Detail erklärt. Die Schritte, die zum Übergeben des Bereichswerts an die Kernelfunktion erforderlich sind, werden erörtert. Eine Demo der Matrixmultiplikation mit der Intel FPGA Dev Cloud wird ebenfalls demonstriert.

  • 00:00:00 In diesem Abschnitt stellt das Video die Matrixmultiplikation als häufig verwendetes Beispiel zum Unterrichten der parallelen Programmierung vor. Das Video erklärt, dass bei der Matrixmultiplikation Zeilen aus einer Matrix und Spalten aus einer anderen genommen werden, um eine elementweise Multiplikation und Akkumulation durchzuführen, um eine resultierende Matrix zu erzeugen. Das Video erklärt, dass es bei dieser Berechnung viel Parallelität gibt, da verschiedene Zeilen und Spalten unabhängig voneinander berechnet werden können. Eine einfache Implementierung der Matrixmultiplikation wird unter Verwendung der regulären C- oder C++-Sprache mit verschachtelten for-Schleifen gezeigt, die die elementweise Multiplikation und Akkumulation ausführen.

  • 00:05:00 In diesem Abschnitt lernen wir die Implementierung einer Einzelelementberechnung in Matrix C kennen, die als eine Kernfunktion implementiert ist, die eine parallele Berechnung ermöglicht. Der entscheidende Punkt ist, dass die Berechnung für jede einzelne Zeile und Spalte gleich ist, wobei der einzige Unterschied die Zeilen- und Spaltennummern sind. Accessoren helfen beim Zugriff auf die Puffer in Kerneln, mit Nur-Lese-Zugriff für die Matrizen A und B und Schreibzugriff für Matrix C. Der Bereich wird als Abstraktion verwendet, um mehrere Dimensionen zu deklarieren, und H.parallel4 hilft bei der Definition einer parallelen Kernel-Funktion . Die Kernel-Funktion enthält eine Lambda-Funktion, wobei das Argument die Variable zum Durchlaufen aller Werte in beiden Dimensionen ist.

  • 00:10:00 In diesem Abschnitt erläutert der Sprecher die Schritte, die zum Übergeben des Bereichswerts an die Kernel-Funktion erforderlich sind, die eine laminare Funktion ist. Sie diskutieren die zwei Dimensionen der Variablen und wie sie jede Variable identifiziert. Der Sprecher erklärt, wie die Lambda-Funktion funktioniert, und zeigt, wie die Problemgröße durch die Anzahl der Zeilen und Spalten definiert wird, auf denen wir die Kernel-Funktionen ausführen. Sie verwenden das Beispiel der Matrixmultiplikation, der traditionellen C-Plus-Plus-Notation und der elementweisen Multiplikation und Akkumulation in der innersten for-Schleife. Abschließend demonstrieren sie eine kurze Demonstration der Matrixmultiplikation mit der Intel FPGA-Entwicklungscloud.