Wissenschaftliches Rechnen III / CP III
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:
Starten Sie jede Simulation mit einer zufälligen Spin-Konfiguration und führen Sie zunächst eine Thermalisierung durch. Dabei bestimmen Sie das optimale \(\delta\) wie in der Vorlesung dargestellt.
Nach der Thermalisierung beginnt die Aufzeichnung der Messwerte. Dabei müssen alle Parameter, auch \(\delta\), fest gehalten werden. Bestimmen Sie \(|M|^2\) nach jedem Sweep.
stat5.cu, stat5.h zur Bestimmunng von Mittelwert, Fehler und integrierter Auto-Korrelationszeit:#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));Siehe stat5.readme für Details.
Messen Sie auch \(S\). Vergleichen Sie die Auto-Korrelationszeiten von \(S\) und \(|M|^2\).
Überzeugen Sie sich, dass der Fehler \(\sigma\) und die integrierter Auto-Korrelationszeit \(\tau_{int}\) der Definition \[\sigma^2 = \frac{2\tau_{int}}{N}\Gamma(0)\] entsprechen. Dabei ist \(N\) die Anzahl der Datenwerte und \(\Gamma(0)\) ihre Varianz (Autokorrelationsfunktion beim Abstand null).
Die Anzahl der Sweeps während der Thermalisierung und während der Messung sollte viel größer als die größte Auto-Korrelationszeit sein. Überprüfen Sie dies im Nachhinein.
Plotten Sie die Mittelwerte mit Fehler (z.B. mit errorbar in Matlab) für alle Kombinationen von \(L\) und \(\kappa\) zusammen.
Geben Sie einen Fehler für Ihren Schätzwert von \(\kappa_c\) an.
10 Punkte
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