In C auf Grafikkarte rechnen?
Hallo,
ich programmiere gerade an einem Mandelbrotkalkulator und wollte wissen, ob es möglich wäre, auf meiner Radeon RX 580-Grafikkarte die for-Schleifen zur Berechnung der einzelnen Pixel zu parallelisieren. Zurzeit benutze ich OpenMP, um das ganze auf meiner CPU zu berechnen, aber es wäre toll, wenn ihr mir eine C-Bibliothek empfehlen könntet, mit der man parallel auf meiner GPU rechnen könnte. Am besten wäre es, wenn diese wie OpenMP mit diesen #pragma Befehlen funktioniert. Gut wäre auch noch ein Beispiel für eine einfache for-Schleife.
Danke
1 Antwort
Das ist etwas komplizierter. Du wirst vermutlich OpenCL verwenden müssen.
(Oder, je nach Anwendungsfall, könntest du auch OpenGL oder Vulkan verwenden. Ob Cuda funktioniert, weiß ich nicht, das ist an sich für Nvidiakarten ausgelegt.)
Ein Beispiel kann ich dir leider nicht liefern, mit OpenCL habe ich noch nicht gearbeitet. Das wird aber wohl so aussehen, dass du einen eigenen File oder eine eigene Funktion schreibst, die der Berechnung einer Workgroup (heißt evtl. je nach API anders) entspricht und du diese Funktion dann mittels des APIs mit einer bestimmten Anzahl Workgroups ausführst.
Ein Beispiel in Pseudocode könnte so aussehen:
Shader (der Code pro Workgroup)
layout(location = 0) restrict writeonly buffer buffer_out_layout{
float buffer_out[];
}
layout(location = 0) uniform uvec2 buffer_size;
void main(){
//Eine Workgroup kann womöglich aus mehreren weiteren Untereinheiten bestehen. Diese können untereinander beispielsweise schneller kommunizieren
const uvec2 index = global_index.xy + local_index.xy;
const uint buffer_index = index.y * buffer_size.x + index.x;
const float result = calc_mandelbrot(index);
buffer_out[buffer_index] = result;
}
Der CPU Code:
//Context erstellen
//...
Shader shader = ...;//Shader erzeugen
//...
api_call(shader, res.x, res.y, 1);
//Auf Ergebnisse warten (Synchronisieren?) und die Ergebnisse nutzen