PC-Kurbel schrieb:
Bisher hatte ich nicht allzuviel mit Programieren zu tun. Nun soll ich aber ein Programm in C oder C++ schreiben, dass monatelang rechnet und am Ende hoffentlich was tolles herauskommt. Da sich das Problem sehr gut parallelisieren lässt, habe ich vor die GPU mit dem Problem zu beauftragen. Nun habe ich aber leider keine Einsteigerfreundliche Anleitung gefunden.
Als Programmieranfänger mit GPUs loszulegen ist nicht ohne...
PC-Kurbel schrieb:
1. Was brauche ich dafür an Programmen? Ich habe eine Ati/Amd Karte, daher habe ich Ati Stream runtergeladen und MS Visual Studio 2010 gabs von der Uni. Habe ich alles?
- CUDA: Nur für NVidia Karten, aber dafür gibts da sehr gute Tools und Dokumentation
- Ati Stream: Nur Ati, aber damit habe ich noch nicht gearbeitet
Ausserdem gibt es OpenCL und DirectX Compute. Beide sitzen quasi eine Schicht darüber und erlauben dir Code zu schreiben, der sowohl auch Ati als auch auf Nvidia läuft. Ich weiß aber nicht, ob es damit auch möglich ist Grafikkarten-spezifische Features zu nutzen. Nvidia GPUs haben beispielsweise einen SharedMemory pro Prozessor, den man je nach Aufgabenstellung gut nutzen kann.
PC-Kurbel schrieb:
2. Wie erreiche ich, dass das Programm auf der Grafikkarte läuft und nicht doch in der CPU?
Du programmierst ganz normal Code der am Host (also der CPU) läuft und ausserdem spezielle Abschnitte, die auf der GPU ausgeführt werden. Die notwendigen Daten musst du zwischen Host und GPU hin und her kopieren.
PC-Kurbel schrieb:
3. Gibt es gravierende Unterschiede zum Code für Programme für die CPU?
Jein. Es ist an und für sich C Code, aber die Art und Weise unterscheidet sich etwas. Bei CUDA nennt man die ausführbaren Teile "Kernel", diese werdem vom Host gestartet.
PC-Kurbel schrieb:
4. Kennt jemand eine gute Anleitung in das Thema?
Für CUDA: Nvidia Homepage.
PC-Kurbel schrieb:
Ich habe schon ein bischen Programiererfahrung gesammelt und eher einfache Programme geschrieben. Allerdings nicht sehr viel und es ist schon Jahre her. So rein Programmiertechnisch ist das Programm wirklich nicht anspruchsvoll, sondern einfach nur rechenintensiv. Eine lauffähige Version habe ich schon in C, allerdings kommt nicht das raus was rauskommen soll, daher steckt irgendwo der Wurm drin. Vielen Dank für die weiteren Antworten.
Versuch erst mal die normale Version richtig zu bekommen, bevor du zum optimieren beginnst.
Ob es auf der GPU dann schneller läuft, hängt von mehreren Faktoren ab. Einerseits brauchst du natürlich eine schnelle Grafikkarte, eine für 50 Euro ist mit Sicherheit langsamer als die CPU. Zumal kann man bei der CPU auch viel machen. Um mal ein paar Stichwörter in den Raum zu werfen: Compiler-Optimierung, Cache-Optimierung, Loop-Unrolling, SSE, etc...
Prinzipiell ist es nicht schwer die GPU rechnen zu lassen. Die meisten einfachen Programme holen dann aber nur 10% der Leistung der GPU raus. Die GPU voll auszulasten ist eine Wissenschaft für sich. (Meine Diplomarbeit ging ein bisschen in die Richtung

)
Manche Aufgabenstellungen lassen sich sogar besser und schneller auf der CPU bearbeiten als auf der GPU. Für manche Sachen ist aber eine GPU auch 100x schneller als ein Quad-Core.
Wenn du schreibst, dass jede Berechnung nur für sich läuft und es keine Datenabhängigkeit gibt, deutet es aber tatsächlich darauf hin, dass sich das gut parallelisieren lässt.
Du musst zudem noch beachten, dass die GPU Leistung in erster Linie für Fließkommazahlen mit einfacher Genauigkeit stehen. Für doppelte Genauigkeit, solltest du das benötigen, sieht das schon wieder ganz anders aus, da deutlich weniger Recheneinheiten dafür auf der GPU sitzen.