In C auf Grafikkarte rechnen?

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