Übungsblatt 0

11.04.2019 / B. Leder

Wissenschaftliches Rechnen III / CP III

Aufgabe 0.1: Matrix-Multiplikation in Matlab

Viele wissenschaftliche Programmpakete wie z.B. Matlab oder Mathematica unterstützen heute GPUs out-of-the-box. In Matlab stehen unter anderem folgende Funktionen zur Verfügung: gpuDevice, gpuArray, gather. Bentuzen Sie diese um folgende Aufgaben zu lösen.

  1. Finden Sie heraus, welches Device (GPU) in Ihrem PC vorhanden ist. Notieren Sie wichtige Eigenschaften wie Anzahl der Kerne (cores), Speicher, etc.
  2. Erzeugen Sie zwei Matrizen \(A, B \in \mathbb{R}^{n\times n}\), mit \(n=1024\) und zufälligen Einträgen, im Speicher des Host (CPU). Kopieren Sie diese dann in den Speicher des Device.
  3. Multiplizieren Sie die beiden Matrizen \[C=A\cdot B\] einmal mit Hilfe der CPU und einmal mit Hilfe der GPU und verifizieren Sie, dass die Ergebnisse übereinstimmen.
  4. Messen Sie die Zeiten für (tictoc)
  5. Bestimmen Sie aus den gemessenen Zeiten die Latenz, die Bandbreite für das Kopieren zwischen Host und Device und den Durchsatz des Host und des Device.

Aufgabe 0.2: Hello World from GPU

Implementieren Sie “Hello World” auf der GPU in CUDA C. Starten Sie von einem “Hello World” für die CPU in einer Datei hello.cu:

#include <stdio.h>

int main(void)
{
    // hello from CPU
    printf("Hello World from CPU!\n");
    return 0;
}

Bevor Sie den CUDA Compiler nvcc benutzen können, müssen Sie einmal module load cuda ausführen. Kompilieren Sie das Programm und führen es aus

   nvcc hello.cu -o hello
   ./hello

Fügen Sie nun über int main ... eine sogenannte Kernel-Funktion hinzu

__global__ void helloFromGPU(void)
{
    // hello from GPU
    printf("Hello World from GPU!\n");
}

und rufen sie im Hauptteil auf

    helloFromGPU <<<1,10>>>();
    cudaDeviceReset();

Kompilieren Sie erneut und beachten Sie den Unterschied in der Ausgabe.

  1. Was passiert, wenn Sie cudaDeviceReset weg lassen?
  2. Was passiert, wenn Sie cudaDeviceReset durch cudaDeviceSynchronize ersetzen?
  3. Benutzen Sie die in CUDA C verfügbare Varaible threadIdx.x, um die ID jedes Threads auszugeben.