Übungsblatt 8

30.06.2018 / B. Leder

Wissenschaftliches Rechnen III / CP III

Aufgabe 8.1: Monte-Carlo-Simulation: Magnetisierung

Bestimmen Sie \(|M_0|^2=<|M|^2>\) bei \(h=0\) und \(\lambda=1.0\) für \(d=3\), \(L=4, 8, 16\) und jeweils mindestens 20 Werte für \(\kappa\). Wählen Sie die \(\kappa\)-Werte um den Meanfield-Wert \(\approx 0.2333\) für das kritische \(\kappa_c\). Interpretieren Sie Ihre Daten (Abhängigkeit von \(L\) und \(\kappa\)) und geben Sie einen Schätzwert für \(\kappa_c\) an.

Hinweise:

#include "stat5.h"
...
// Initialisierung des Statistikmoduls, eine Observable
clear5(1,500);
// Sweeps
for (i=1; i<=nsweep; i++)
{
  metro_sweep(delta);
  m=magnet();
  // Messwert für Auswertung speichern
  accum5(1,cuCabs(m)*cuCabs(m));
}
// Mittelwert, Fehler, Auto-Korrelationszeit
printf(" |M|^2:    %f, %f, %f\n",aver5(1),sigma5(1),tauint5(1));

10 Punkte

Aufgabe 8.2: Monte-Carlo-Simulation: GPU

Planen Sie die Implementierung auf der GPU. Dabei soll ein Sweep und die Messung vollständig auf der GPU laufen. Das Ergebnis einer Messung soll sofort auf die CPU kopiert werden. Geben Sie eine Liste der notwendigen Kernel an und beschreiben Sie jeweils kurz die Aufgaben und die geplante Threadverteilung (Datenverteilung auf Threads). Zeichnen Sie ein Programmablaufplan.

Beachten Sie hierbei besonders, dass der Sweep die Gleichgewichtsbedingung erfüllt. Im Allgemeinen hängen die Updates der einzelnen Spins voneinander ab (z.B. wenn einer der Nachbarn bereits ein Update erfahren hat). Dann muss die Reihenfolge in jedem Sweep gleich sein. Das ist ungünstig für die Implementierung auf der GPU (parallele Ausführung). Ein Ausweg ist die Punkte des Gitters in Untermengen aufzuteilen, so dass die Updates der Spins in einer Untermenge unabhängig voneinander sind. Diese können dann in beliebiger Reihenfolge durchlaufen werden und nur die Abfolge der Untermengen muss für jeden Sweep gleich sein.

5 Punkte