Arokh
2007-08-26, 01:11:01
Hi Leute,
angespornt durch diesen Thread:
http://www.forum-3dcenter.org/vbulletin/showthread.php?t=376701&highlight=Molekulardynamik
habe ich mich mal mit der Frage beschäftigt, wie gut sich Molekulardynamik-Simulationen in Form von Multithreading parallelisieren lassen. Ich habe z.B. mal vor einer Weile eine Simulation von wechelwirkenden Teilchen geschrieben, und habe jetzt, wo ich gerade einen neuen Dual Core-Prozessor habe, darüber nachgedacht, diese durch Multithreading zu beschleunigen. Dabei bin ich aber auf das Problem gestoßen, daß die Wechselwirkung zwischen den Teilchen die Parallelisierbarkeit massiv einschränkt:
N Teilchen werden durch einen Positionsvektor im 6*N-dimensionalen Phasenraum (für jedes Teilchen 3 Ortskoordinaten und 3 Geschwindigkeitskomponenten) beschrieben. In jedem Rechenschritt wird aus dem aktuellen Positionsvektor ein Vektor mit den Zeitableitungen berechnet und daraus der Positionsvektor für den nächsten Zeitpunkt. Eine naheligende Idee wäre jetzt, zwei Threads zu machen, von denen jeder N/2 Teilchen berechnet. Das Problem dabei ist aber, daß aufgrund der Wechselwirkung die Zeitableitung für jedes Teilchen i.a. von den Positionen aller N Teilchen abhängt. D.h. man kann nicht einfach den Zeitableitungsvektor der ersten N/2 Teilchen unabhängig vom Positionsvektor der übrigen N/2 Teilchen berechnen. Vielmehr müßte, wenn die Zeitableitungen der ersten N/2 Teilchen zum i-ten Zeitpunkt berechnet werden, sichergestellt sein, daß von den übrigen N/2 Teilchen die entsprechenden Positionen zum i-ten Zeitpunkt bereits berechnet sind.
In einer Multithreading-Realisierung würde das einen enormen Synchronisationsaufwand zwischen den beiden Threads bedeuten: wenn ein Thread die Zeitableitungen seiner N/2 Teilchen zum Zeitpunkt i berechnen will, muß er erst überprüfen, ob der andere Thread die Positionen seiner Teilchen für den Zeitpunkt i fertig hat, und gegebenenfalls darauf warten. Ich habe das mal tatsächlich ausprobiert, und es sieht so aus, daß der Synchronisationsaufwand so sehr auf die Performance drückt, daß diese unter das Niveau der Singlethreading-Lösung fällt.
Daher wollte ich mal nachfragen, ob es da vielleicht ein paar Tricks gibt, die man verwenden kann. Laut o.g. Thread scheint Parallelisierung bei Molekulardynamik-Simulationen ja durchaus ein Thema zu sein.
angespornt durch diesen Thread:
http://www.forum-3dcenter.org/vbulletin/showthread.php?t=376701&highlight=Molekulardynamik
habe ich mich mal mit der Frage beschäftigt, wie gut sich Molekulardynamik-Simulationen in Form von Multithreading parallelisieren lassen. Ich habe z.B. mal vor einer Weile eine Simulation von wechelwirkenden Teilchen geschrieben, und habe jetzt, wo ich gerade einen neuen Dual Core-Prozessor habe, darüber nachgedacht, diese durch Multithreading zu beschleunigen. Dabei bin ich aber auf das Problem gestoßen, daß die Wechselwirkung zwischen den Teilchen die Parallelisierbarkeit massiv einschränkt:
N Teilchen werden durch einen Positionsvektor im 6*N-dimensionalen Phasenraum (für jedes Teilchen 3 Ortskoordinaten und 3 Geschwindigkeitskomponenten) beschrieben. In jedem Rechenschritt wird aus dem aktuellen Positionsvektor ein Vektor mit den Zeitableitungen berechnet und daraus der Positionsvektor für den nächsten Zeitpunkt. Eine naheligende Idee wäre jetzt, zwei Threads zu machen, von denen jeder N/2 Teilchen berechnet. Das Problem dabei ist aber, daß aufgrund der Wechselwirkung die Zeitableitung für jedes Teilchen i.a. von den Positionen aller N Teilchen abhängt. D.h. man kann nicht einfach den Zeitableitungsvektor der ersten N/2 Teilchen unabhängig vom Positionsvektor der übrigen N/2 Teilchen berechnen. Vielmehr müßte, wenn die Zeitableitungen der ersten N/2 Teilchen zum i-ten Zeitpunkt berechnet werden, sichergestellt sein, daß von den übrigen N/2 Teilchen die entsprechenden Positionen zum i-ten Zeitpunkt bereits berechnet sind.
In einer Multithreading-Realisierung würde das einen enormen Synchronisationsaufwand zwischen den beiden Threads bedeuten: wenn ein Thread die Zeitableitungen seiner N/2 Teilchen zum Zeitpunkt i berechnen will, muß er erst überprüfen, ob der andere Thread die Positionen seiner Teilchen für den Zeitpunkt i fertig hat, und gegebenenfalls darauf warten. Ich habe das mal tatsächlich ausprobiert, und es sieht so aus, daß der Synchronisationsaufwand so sehr auf die Performance drückt, daß diese unter das Niveau der Singlethreading-Lösung fällt.
Daher wollte ich mal nachfragen, ob es da vielleicht ein paar Tricks gibt, die man verwenden kann. Laut o.g. Thread scheint Parallelisierung bei Molekulardynamik-Simulationen ja durchaus ein Thema zu sein.