PHPC Parallel and High Performance Computing – Erstklausur 2025

(Dies ist ein Gedankenprotokoll, das den Klausurinhalt versucht detailliert wiederzugeben.)


Aufgabe 1: Computational Intensity

  • Beschreibung:
    Definieren Sie den Begriff der Computational Intensity.
    Ein mögliches mathematisches Beispiel wäre:

  • Shared Memory Prints:

    • Geben Sie Beispiele, in denen verschiedene Threads ihre Ausgaben (Prints) erzeugen.
    • Erklären Sie, in welcher Reihenfolge die einzelnen Threads (z. B. Thread 1, Thread 2, …) ihre Ausgaben produzieren.
    • Diskutieren Sie, wie die Reihenfolge der Prints durch Synchronisation oder Scheduling beeinflusst wird.

Aufgabe 2: Cache Misses

  • Erklärung:
    Beschreiben Sie, was Cache Misses sind, und warum sie auftreten.

  • Arten von Cache Misses:
    Nennen und erklären Sie die unterschiedlichen Typen, z. B.:

    • Compulsory Misses (Kaltstarts)
    • Capacity Misses
    • Conflict Misses

Aufgabe 3: False Sharing

  • Definition:
    Erklären Sie den Begriff False Sharing.

  • Behebung:
    Beschreiben Sie Ansätze, um False Sharing zu beheben, beispielsweise durch Padding oder Neuordnung der Daten.

  • Unterschied zu True Sharing:
    Diskutieren Sie den Unterschied zu True Sharing, bei dem mehrere Threads absichtlich auf dieselben Daten zugreifen, um Kommunikation zu ermöglichen.


Aufgabe 4: OpenMP

  • Kursinhalt:
    Erläutern Sie die Grundlagen von OpenMP, wie sie im Kurs behandelt wurden.

  • Print Statements in verschiedenen Bereichen:

    • Erklären Sie, wie viele Print-Ausgaben in Parallelbereichen und in kritischen Abschnitten (Critical Sections) ausgegeben werden.
    • Untersuchen Sie, wie der Einsatz von Critical Sections die Ausgabe-Reihenfolge beeinflusst.
  • Shared Attributes:
    Beschreiben Sie, ob und wie Variablen als first private, mapped, private, shared usw. deklariert wurden.
    Erklären Sie deren Bedeutung und Auswirkungen auf die Parallelität.


Aufgabe 5: Numer

  • Befehl und Output:
    Erklären Sie den Befehl:

    und interpretieren Sie den dazugehörigen Output im Hinblick auf die verwendete Hardware.


Aufgabe 6: Code-Optimierung (Array-Multiplikation)

  • Gegebener Code:
    Ein Beispiel könnte eine Matrixmultiplikation sein, bei der für jedes Element gilt:

  • Optimierung:
    Erklären Sie, wie Sie den Code „speed-uppen“ können, z. B. durch:

    • Schleifenoptimierung
    • Parallelisierung
    • Nutzung von SIMD-Instruktionen oder anderen Hardware-Optimierungen

Aufgabe 7: Scaling Study

  • Graphen Zuordnung:

    • Graph 1: Eine nahezu horizontale Linie (parallel zur X-Achse), die Strong Scaling darstellt.
      Beispielhaftes Skalierungsmaß:

    • Graph 2: Ein Graph, der von oben links nach unten rechts verläuft und Weak Scaling repräsentiert.

  • Abweichungen vom Ideal:
    Erklären Sie, warum der Graph vom idealen Skalierungsverhalten abweicht und welche Faktoren (z. B. Overhead, Kommunikationskosten) dazu führen.


Aufgabe 8: MPI

  • Korrektheit der MPI-Codeabschnitte:
    • Analysieren Sie, ob die gegebenen MPI-Codeabschnitte korrekt implementiert sind.
    • Diskutieren Sie, ob es zu Deadlocks kommen kann, und begründen Sie Ihre Antwort.
/* Beispielcode zu Aufgabe 8: MPI
   Aufgabe: Analysieren Sie, ob die gegebenen MPI-Codeabschnitte korrekt implementiert sind.
   Diskutieren Sie, ob es zu Deadlocks kommen kann.
*/
 
#include <mpi.h>
#include <stdio.h>
 
int main(int argc, char **argv) {
    MPI_Init(&argc, &argv);
 
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
 
    int send_data = rank;   // Daten, die gesendet werden (z.B. die Prozess-ID)
    int recv_data = -1;     // Variable zum Empfangen der Daten
    MPI_Status status;
 
    if (size < 2) {
        if (rank == 0) {
            printf("Dieses Beispiel erfordert mindestens 2 Prozesse.\n");
        }
        MPI_Finalize();
        return 0;
    }
 
    /*
       Codeabschnitt A:
       - Prozess 0 sendet zunächst, dann empfängt er.
       - Prozess 1 empfängt zunächst, dann sendet er.
       Dieser Ablauf soll einen Deadlock vermeiden.
    */
    if (rank == 0) {
        MPI_Send(&send_data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
        MPI_Recv(&recv_data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
        printf("Prozess %d: Daten %d von Prozess 1 empfangen.\n", rank, recv_data);
    } else if (rank == 1) {
        MPI_Recv(&recv_data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
        MPI_Send(&send_data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
        printf("Prozess %d: Daten %d von Prozess 0 empfangen.\n", rank, recv_data);
    }
 
    /*
       Codeabschnitt B: Mögliches Deadlock-Szenario
       Beide Prozesse führen MPI_Send und MPI_Recv in gleicher Reihenfolge aus.
       Bitte analysieren Sie, ob hier ein Deadlock auftreten kann!
    */
    if (rank == 0 || rank == 1) {
        MPI_Send(&send_data, 1, MPI_INT, (rank + 1) % 2, 1, MPI_COMM_WORLD);
        MPI_Recv(&recv_data, 1, MPI_INT, (rank + 1) % 2, 1, MPI_COMM_WORLD, &status);
        printf("Prozess %d: Nachrichtenaustausch abgeschlossen, empfangene Daten: %d\n", rank, recv_data);
    }
 
    MPI_Finalize();
    return 0;
}
 
  • Kommunikation in MPI:
    • Erklären Sie den Unterschied zwischen Blocking und Non-Blocking Kommunikation.
    • Beschreiben Sie, welche Funktion MPI Tags haben, um Nachrichten zu identifizieren.
    • Erklären Sie die allgemeinen Kommunikationsmechanismen in MPI.
    • Erläutern Sie, was MPI Window Objects sind und welche Rolle sie in der Kommunikation (z. B. in RMA, Remote Memory Access) spielen.

Aufgabe 9: HPC Netzwerk-Kommunikation

  • Netzwerktechnologien:
    Nennen Sie die zwei wesentlichen Netzwerk-Kommunikationstechnologien, die in HPC eingesetzt werden.
  • Latency in HPC Networks:
    • Definieren Sie den Begriff Latency:
    • Erklären Sie, in welchen Anwendungen die Latenz ein kritischer Leistungsindikator ist.
  • Praxisbeispiel:
    Entwickeln Sie ein Programmkonzept, das die Inter-Node Latency misst.

Aufgabe 10: Historische Verbesserung der Latenz

  • Diskussion:
    Diskutieren Sie die historischen Verbesserungen der Latenz in Bezug auf:
    • Computational to Bandwidth
    • Floating
      Erklären Sie, wie sich diese Verbesserungen auf moderne HPC-Systeme ausgewirkt haben.

Aufgabe 11: Surface-to-Volume Ratio in HPC Systems

  • Definition:
    Erklären Sie das Surface-to-Volume Ratio, welches z. B. wie folgt definiert werden kann:

  • Bedeutung:
    Diskutieren Sie, warum dieses Verhältnis ein wichtiger Leistungsindikator für die Performance von HPC-Systemen ist, insbesondere in Bezug auf Kommunikations- und Speicherzugriffsmuster.


Aufgabe 12: Graph Petitioning (Graph Partitioning)

  • Definition:
    Erklären Sie, was unter Graph Petitioning (im Kontext von Graph Partitioning) zu verstehen ist.

  • Bedeutung:
    Diskutieren Sie, welche Rolle dieses Konzept bei der Optimierung von HPC-Anwendungen spielt, z. B. beim Ausbalancieren der Last in parallelen Berechnungen.


Aufgabe 13: Vektoraddition in UPC

  • Gegebene Situation:
    Eine Vektoraddition wird durchgeführt, bei der gilt:

    Das heißt, für jedes Element:

  • UPC “for all” Schleife:
    Es gibt zwei Varianten der Schleife:
    Eine Version verwendet den Ausdruck i als viertes Argument, die andere i + 1.
    Ein typischer Loop könnte so aussehen:

  for (i = 0; i < N; i++; <Vierte Ausdruck>)
  {
      C[i] = A[i] + B[i];
  }
  • Aufgabenstellung:
    • Erklären Sie die Rolle des vierten Ausdrucks in der UPC “for all” Schleife.
    • Diskutieren Sie, welche Performance-Unterschiede sich aus der Verwendung von i gegenüber i + 1 als viertes Argument ergeben.
    • Erörtern Sie die Implikationen, die dieser vierte Parameter für die Iterationsaufteilung und Datenverteilung hat.
×

MyUniNotes is a free, non-profit project to make education accessible for everyone. If it has helped you, consider giving back! Even a small donation makes a difference.

These are my personal notes. While I strive for accuracy, I’m still a student myself. Thanks for being part of this journey!