OpenCL

OpenCL Beschreibung des OpenCL.jpg-Bildes.

Information
Schöpfer Apfel
Entwickelt von Khronos Group
Erste Version 28. August 2009
Letzte Version 3,0 (30. September 2020)
Geschrieben in C und C ++
Betriebssystem Microsoft Windows , MacOS , Linux , FreeBSD und Android
Umgebung X86_64- , IA-32- ( in ) und ARM-Architektur
Art Framework
Programmiersprache
Lizenz Open-Source-Lizenz ( d )
Webseite www.khronos.org/opencl

OpenCL ( Öffnen C omputing L anguage ) ist die Kombination aus einer API und eine Programmiersprache, abgeleitet von C , als ein offener Standard , der von der vorgeschlagenen Khronos Group . OpenCL wurde entwickelt, um heterogene parallele Systeme zu programmieren, die beispielsweise sowohl eine Mehrkern- CPU als auch eine GPU umfassen . OpenCL bietet daher ein Programmiermodell an, das sich an der sich abzeichnenden Schnittstelle zwischen der Welt der CPUs und GPUs befindet , wobei das erstere immer paralleler und das letztere immer programmierbarer wird.

Präsentation

OpenCL unterscheidet den Host-Prozessor (zentraler Prozessor als Leiter) von Peripheriegeräten (CPU, GPU oder andere), deren Aufgabe es ist, rechenintensive Kerne auszuführen. OpenCL unterscheidet daher einerseits die Anwendung, die auf dem Host-Prozessor ausgeführt wird (und die OpenCL-API aufruft), und andererseits die Kernel, die in OpenCL-C programmiert sind (und deren Berufung auf Geräten ausgeführt werden soll).

OpenCL ermöglicht es, Aufgabenparallelität, aber auch Datenparallelität in zwei Formen auszudrücken. SPMD ( Single Program Multiple Data ) und SIMD ( Single Instruction Multiple Data ), alle hierarchisch. Ein Aufgabendiagramm kann dynamisch über die OpenCL-API erstellt werden. Jede Aufgabe kann entweder als einzelne Instanz (als Aufgabe bezeichnet) oder als Sammlung von Instanzen (als NDRange bezeichnet) desselben Kernels dargestellt werden. NDRanges können 1, 2 oder 3 Dimensionen haben. Jede Kernel - Instanz zu einer NDRange gehören , ist ein sogenannter Arbeits Artikel . Der NDrange kann selbst in Arbeitsgruppen strukturiert werden , wodurch Arbeitselemente innerhalb von Arbeitsgruppen Daten austauschen und sich über Barrieren synchronisieren können.

Wenn OpenCL unter einigen seiner technischen Ziele näher an C für CUDA zu liegen scheint , dem proprietären Programmiermodell des Unternehmens Nvidia, hat OpenCL umfassendere Ziele, da es nicht nur GPUs gewidmet ist. In der Welt der High Performance Computing oder Spielen wird OpenCL machen es möglich , die Vorteile der Leistung von Grafikprozessoren, Multi-Core - CPUs oder andere rechenintensive Systeme wie zu nehmen , wie IBM CELL , die insbesondere die stattet PlayStation 3 mit Sony. In der Welt der eingebetteten Systeme auf einem Chip ( SoC ), wie sie in Smartphones zu finden sind , ermöglicht OpenCL über eine einzigartige Programmierinfrastruktur den Zugriff auf den Zentralprozessor sowie auf die verschiedenen eingebetteten Multimedia-Subsysteme (GPU, DSP) , Computerarray oder andere).

Derzeit gibt es nur wenige Möglichkeiten, OpenCL-Kernel zu debuggen. Erstens unterstützt der NVIDIA Parallel Nsight- Debugger , der CUDA Thread für Thread debuggen kann, derzeit OpenCL nicht, sondern ermöglicht nur die Verfolgung von API-Aufrufen . Anschließend schlägt AMD eine Erweiterung vor, mit der Traces direkt in den OpenCL-Code (cl_amd_printf) eingefügt werden können. Schließlich können Sie mit einem Programm namens gDebugger (von Gremedy, dann von AMD ) den Fortschritt des Algorithmus Thread für Thread verfolgen. gDebugger hat sich weiterentwickelt, heißt jetzt CodeXL und wird von der GPUOPEN- Initiative gehostet .

Historisch

OpenCL wurde ursprünglich von Apple (das die Marke eingetragen hat) entwickelt und in Zusammenarbeit mit AMD , Intel und Nvidia weiterentwickelt . Apple unterbreitet seinen ersten Vorschlag zunächst der Khronos-Gruppe . Das16. Juni 2008Die Khronos Compute Working Group besteht aus Vertretern von Hardware- und Softwareherstellern. Er arbeitete fünf Monate lang, um die technischen Details der OpenCL 1.0- Spezifikation zu vervollständigen . Die Spezifikation wird von Khronos-Mitgliedern geprüft und für eine Testversion am genehmigt8. Dezember. Eine neue Version, OpenCL 1.1 , wird in veröffentlichtJuni 2010von der Khronos Group . OpenCL 1.1 klärt einige Aspekte der vorherigen Beschreibung und bringt neue Funktionen wie sub- Puffer , 3-Element - Vektoren, Benutzerereignisse, neue eingebaute Funktionen , Unterstützung für Standard optional 1,0 Erweiterungen (wie 32-Bit - Funktionen atomic).

OpenCL ist in Mac OS X 10.6 ( Snow Leopard ) integriert. AMD beschließt, OpenCL und DirectX 11 anstelle von Close to Metal in seinem Stream SDK-Framework zu unterstützen . RapidMind  (in) kündigt die Einführung von OpenCL in seiner Plattformentwicklung an, um Grafikprozessoren verschiedener Hersteller mit einer einzigen Schnittstelle zu unterstützen. Nvidia bestätigt auch die9. Dezember 2008Volle Unterstützung für die 1.0-Spezifikation in seinem GPU Computing Toolkit .

Das 15. November 2011hat die Khronos Group die Spezifikationen für OpenCL 1.2 veröffentlicht . Es enthält Funktionen in Bezug auf Mobilität und Portabilität, beispielsweise mit der Möglichkeit, die Kompilierung und Bearbeitung von Kernel-Links zu .

WebCL

Die Khronos Group hat außerdem eine Integration von OpenCL, einer parallelen Computerbibliothek, in alle HTML5- Programmierschnittstellen entwickelt . Derzeit verwenden Browser Erweiterungen, um OpenCL zu verwalten.

Nokia und Mozilla haben Erweiterungen für Firefox entwickelt. Samsung auf WebKit und Motorola für Node.js .

Geschichte der Implementierungen

OpenCL-Implementierungen existieren heute für die meisten Plattformen. IBM für seine Supercomputer unter GNU / Linux mit Power-Prozessoren, X86-Prozessoren von Intel und AMD und den traditionell dazugehörigen GPUs (ATI, nVidia, VIA), ARM Cortex-A9- Prozessoren (SSE- und fpu 128-Bit-Neon-Teile) sowie DSPs , GPUs und anderen Arrays Computing sie in den vielen Implementierungen von Begleit System on Chip (SoC) (nVidia Tegra2 , Qualcomm Snapdragon , Apple A4 , Marvell Armada ,  usw. ). Mesa (OpenGL / OpenVG-Implementierung unter GNU / Linux) enthält einen in Entwicklung befindlichen OpenCL- State-Tracker für Gallium3D namens Clover Dieser Link verweist auf eine Begriffsklärungsseite

Das 10. Dezember 2008, AMD und Nvidia machen die erste öffentliche Demonstration von OpenCL, einer 75-minütigen Präsentation auf der SIGGRAPH Asia 2008 . AMD demonstriert CPU-beschleunigtes OpenCL und erklärt die OpenCL-Skalierbarkeit auf einem oder mehreren Kernen, während NVIDIA eine GPU-beschleunigte Demo demonstriert.

Das 26. März 2009Auf der GDC 2009 demonstrieren AMD und Havok die erste OpenCL-beschleunigte Implementierung, Havok Cloth, auf einer GPU der AMD Radeon HD 4000- Serie .

Das 20. April 2009Nvidia kündigt Entwicklern, die an seinem OpenCL Early Access-Programm teilnehmen , die Veröffentlichung seines OpenCL-Treibers und des SDK an .

Das 5. August 2009AMD enthüllt die ersten Entwicklungstools für seine OpenCL-Plattform als Teil seines ATI Stream SDK v2.0 Beta-Programms .

Das 28. August 2009Apple veröffentlicht Mac OS X Snow Leopard , das eine vollständige Implementierung von OpenCL enthält.

In Snow Leopard wird OpenCL zunächst auf ATI Radeon HD 4850- , ATI Radeon HD 4870- Chips sowie auf Nvidia Geforce 8600M GT, GeForce 8800 GS, GeForce 8800 GT, GeForce 8800 GTS, Geforce 9400M, GeForce 9600M GT und GeForce GT- Chips 120 unterstützt , GeForce GT 130 , GeForce GTX 285 , Quadro FX 4800 und Quadro FX 5600 .

Das 28. September 2009Nvidia veröffentlicht seine eigenen OpenCL-Treiber und SDK-Implementierung.

Das 13. Oktober 2009AMD veröffentlicht die vierte Beta des ATI Stream SDK 2.0 , die eine vollständige OpenCL-Implementierung auf allen GPUs der R700 / R800- Familien bietet, auch unter Verwendung von SSE3- Einheiten der CPUs. Das SDK ist sowohl für GNU / Linux als auch für Windows verfügbar .

Das 30. Oktober 2009, Wird IBM die Freigabe der Version 0.1 seines OpenCL SDK für GNU / Linux auf der Power - Architektur in der Mehrheit der leistungsstärksten Supercomputer der Welt verwendet.

Das 26. November 2009Nvidia veröffentlicht Treiber für die OpenCL 1.0-Implementierung (Version 48).

Die OpenCL-Implementierungen von Apple, Nvidia, RapidMind  (in) und Mesa Gallium3D basieren alle auf der Kompilierungstechnologie LLVM und verwenden den Compiler Clang als Frontend .

Das 10. Dezember 2009, VIA veröffentlicht sein erstes Produkt, das OpenCL 1.0 unterstützt - den ChromotionHD 2.0- Videoprozessor, der in den VN1000-Chips enthalten ist .

Das 21. Dezember 2009AMD veröffentlicht die Produktionsversion des ATI Stream SDK 2.0 , das OpenCL 1.0-Unterstützung für R800- GPUs und Beta-Unterstützung für R700 bietet .

Das 29. Juni 2011Intel veröffentlicht die endgültige Version seines Entwicklungskits, die OpenCL Version 1.1 unterstützt .

Das 3. August 2011AMD kündigt sein ATI Stream SDK 2.5- Entwicklungskit an , das unter anderem die CPU- / GPU-Bandbreite verbessert, um mehr aus seinen jüngsten APUs herauszuholen .

Bei Intel wurden die Grafikprozessoren in die Reihe der Ivy Bridge- Prozessoren aufgenommen , die am veröffentlicht wurden29. April 2012Intel HD 2500 sowie HD 4000 und höher sind die ersten Architekturen, die OpenCL in Version 1.1 Hardware unterstützen .

Die Donut- Bibliothek ist eine kostenlose OpenCL-Bibliothek für Intel Ivy Bridge GT2- Prozessoren , die im Rahmen des freedesktop.org- Projekts hauptsächlich von Intel entwickelt wurde. Es verwendet hauptsächlich LLVM , ist aber auch mit GCC kompatibel .

Ende 2013 kündigte ARM sein „  Mali OpenCL SDK  “ für seinen Mali T600 und höhere Grafikprozessoren an , deren erste Modelle 2012 veröffentlicht wurden. Die Quellen sind verfügbar, die Lizenz ist jedoch urheberrechtlich geschützt und verbindlich Umverteilung.

Open-Source-Implementierungen

Clover [5] und libCLC [6] für die Funktionen der OpenCL-Standardbibliothek POCL (Portable OpenCL) [7]

Beispiel

In diesem Beispiel wird eine schnelle Fourier-Transformation berechnet

/* creation d'un contexte de calcul sur GPU */ context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL); /* récupération de la liste des cartes disponibles */ clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &nb_devices); clGetContextInfo(context, CL_CONTEXT_DEVICES, nb_devices, devices, NULL); /* creation d'une queue de commande sur le premier GPU */ queue = clCreateCommandQueue(context, devices[0], 0, NULL); /* allocation des tampons mémoire */ memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL); memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL); /* création du programme de calcul (le programme qui s'execute sur le GPU) */ program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL); /* compilation du programme */ clBuildProgram(program, 0, NULL, NULL, NULL, NULL); /* création du noyau de calcul */ kernel = clCreateKernel(program, "fft1D_1024", NULL); /* mise en place des paramètres */ clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]); clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]); clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL); clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL); /* création des objets de travail et lancement du calcul */ global_work_size[0] = num_entries; local_work_size[0] = 64; clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

Die Berechnung: (basierend auf der Anpassung der FFT an die G80-Architektur )

// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into // calls to a radix 16 function, another radix 16 function and then a radix 4 function __kernel void fft1D_1024 (__global float2 *in, __global float2 *out, __local float *sMemx, __local float *sMemy) { int tid = get_local_id(0); int blockIdx = get_group_id(0) * 1024 + tid; float2 data[16]; // starting index of data to/from global memory in = in + blockIdx; out = out + blockIdx; globalLoads(data, in, 64); // coalesced global reads fftRadix16Pass(data); // in-place radix-16 pass twiddleFactorMul(data, tid, 1024, 0); // local shuffle using local memory localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4))); fftRadix16Pass(data); // in-place radix-16 pass twiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplication localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15))); // four radix-4 function calls fftRadix4Pass(data); fftRadix4Pass(data + 4); fftRadix4Pass(data + 8); fftRadix4Pass(data + 12); // coalesced global writes globalStores(data, out, 64); }

Verweise

  1. "  https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html  " ,27. April 2020
  2. (in) [PDF] .
  3. (de) [1] .
  4. (in) "  CodeXL ist auf GPUOPEN umgezogen!  ” (Zugriff am 29. August 2016 ) .
  5. (in) "  Apple zeigt Entwicklern eine Vorschau auf Mac OS X Snow Leopard  " , Apple,9. Juni 2008.
  6. Pressemitteilung von Nvidia .
  7. (de) [2] .
  8. (de) OpenCL
  9. http://webcl.nokiaresearch.com/
  10. (in) "  repo git Clover  " ,4. Januar 2010(Zugriff auf den 30. Januar 2010 ) .
  11. (in) "  OpenCL über Mesa, Gallium3D-Diskussion  " ,9. Dezember 2009(Zugriff auf den 30. Januar 2010 ) .
  12. (in) "  OpenCL Demo AMD CPUs  " ,10. Dezember 2008(abgerufen am 28. März 2009 ) .
  13. (in) "  OpenCL Demo NVIDIA GPU  " ,10. Dezember 2008(abgerufen am 28. März 2009 ) .
  14. (in) "  AMD und Havok Demo OpenCL beschleunigte Physik  " , PC Perspective26. März 2009(abgerufen am 28. März 2009 ) .
  15. (in) "  NVIDIA veröffentlicht OpenCL-Treiber für Entwickler  " , NVIDIA,20. April 2009(abgerufen am 27. April 2009 ) .
  16. (in) "  AMD kehrt GPGPU um, OpenCL SDK für x86 annonce  " , Ars Technica,5. August 2009(abgerufen am 6. August 2009 ) .
  17. (in) Dan Moren, Jason Snell, "  Live-Update: WWDC 2009 Keynote  " , macworld.com , MacWorld,8. Juni 2009(abgerufen am 12. Juni 2009 ) .
  18. (in) "  Mac OS X Schneeleopard - Technische Daten und Systemanforderungen  " , Apple Inc.,8. Juni 2009(Zugriff auf den 25. August 2009 ) .
  19. (in) "  Beta-Programm für das ATI Stream Software Development Kit (SDK) v2.0  " (abgerufen am 14. Oktober 2009 ) .
  20. (in) "  OpenCL Development Kit für Linux on Power  " (abgerufen am 30. Oktober 2009 ) .
  21. (in) "  Eintrag für Apple LLVM-Benutzer auf Seite  " (abgerufen am 29. August 2009 ) .
  22. (in) "  Nvidia-Eintrag auf der LLVM-Benutzerseite  " (Zugriff am 6. August 2009 ) .
  23. (in) "  Rapidmind Eintrag auf LLVM Seite Benutzer  " (Zugriff auf 1 st Oktober 2009 ) .
  24. (in) "  Zack Rusin Blog - Post über die Mesa Gallium3D OpenCL Implementierung  " (Zugriff auf 1 st Oktober 2009 ) .
  25. (en) [3] .
  26. (in) "  ATI Stream SDK v2.0 mit OpenCL 1.0-Unterstützung  " (abgerufen am 23. Oktober 2009 ) .
  27. (en) [4] .
  28. (in) "  AMD APP SDK 2.5 Bietet verbesserte Leistung und neue Funktionen Major  " (abgerufen am 3. August 2011 ) .
  29. "  Neue Treiber bei Intel: OpenGL 4.0 und Ultra HD für Ivy Bridge  " ,24. Oktober 2012(abgerufen am 10. Dezember 2013 ) .
  30. "  Donut  " (abgerufen am 10. Dezember 2013 ) .
  31. (in) "  Mali OpenCL SDK  " [ Archiv9. Dezember 2013] (abgerufen am 10. Dezember 2013 ) .
  32. (in) FFT auf G80-Architektur anpassen  " , Vasily Volkov und Brian Kazian, Projektbericht UC Berkeley CS258, Mai 2008(abgerufen am 14. November 2008 )

Siehe auch