Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

xardias

Community-Fossil

  • »xardias« ist der Autor dieses Themas

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

1

17.06.2008, 11:54

C++: Mehrcpu Systeme, auf entfernten Speicher zufreifen?

Hallo allerseits :),

nachdem ich euch arme Seelen schon im IRC genervt habe, hab ich mich mal hier im Forum registriert ;).

Ich habe mal eine allgemeine Frage zu C++ auf Systemen mit mehreren Prozessoren (unter linux). Diese haben soweit ich informiert bin ja für jeden Prozessor einen eigenen Hauptspeicher.

Unter Linux kann man mittels numacl festlegen welchen Prozessor, und welchen Hauptspeicher man sein Programm benutzen lassen will. Doch würde ich sowas in der Art gerne auch zur Laufzeit des Programms im Code selbst beeinflussen können.

Doch frage ich mich, vor allem wenn es an Multithreading geht:
Wie kann man Daten zwischen den Speichern austauschen? Gibt es Möglichkeiten explizit Speicher von CPU0 aus auf CPU1 zu erzeugen?

Oder muss ich dazu einen Thread auf CPU1 starten, welcher den Speicher freischaufelt und die Adresse an CPU0 zurück gibt. Und.. kann ich dabei sicher sein, dass der Thread auf CPU1 dann auch wirklich den Speicher von CPU1 nutzt?

Wäre schön, wenn jemand darauf eine Antwort wüsste, ich stehe da ziemlich auf dem Schlauch..

Grüße,
Dennis

Sicaine

unregistriert

2

17.06.2008, 13:16

Die Cores haben nicht unterschiedliche Hauptspeicher, sie haben unterschiedliche Caches. Fuer Cachemanagment kuemmert sich intern der CPU selbst drum.

Auf das was du achten must sind die cachemisses. Wenn Thread 1 Daten veraendert und Thread 2 sie auch, must du sie erstmal syncen um Race conditions zu verhindern und wenn du das machst, kostet das unter Umstaenden.

Kuemmern must du dich also garnicht drum und ka wieviel Erfahrung du damit hast, wenn es dir eher um Anwenden geht als um richtig verstehen, empfehle ich dir sowas wie ThreadingBuildingblocks von Intel.

xardias

Community-Fossil

  • »xardias« ist der Autor dieses Themas

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

3

17.06.2008, 14:31

Okay.. ich dachte dabei handelt es sich allgemein um eine Eigenschaft von Mehrprozessorsystemen. Kein Wunder, dass ich dazu nichts finde.

Beim Cell Prozessor jedoch, ist das mit den unterschiedlichen Hauptspeichern der Fall. Aber somit weiß ich schonmal, dass ich nach Cell spezifischen Lösungen suchen muss ;).

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

17.06.2008, 17:44

Sprich du willst nur für Cell-Prozessoren programmieren? Weil ansonsten kann man jeden Thread seinen eigenen Speicher allokieren lassen (egal ob die nun alle auf einen oder duzenden Kernen laufen).
Eigentlich ist es bei x86 kompatiblen System sogar egal in welchen Thread man den Speicher allokiert (soweit ich weiß). Wichtig ist nur, dass eben nur ein Thread drauf zugreift. Zur Kommunikation zwischen den Threads gibt es einige Varianten:
-gelockte Containter (Mutex/CriticalSection um Standardcontainter)
-lockfreie Stacks/Queues (gibt verschiedene Varianten (wartefreie und nicht wartefreie))
-prozessübergreifende Speicherbereiche
-klassische Pipes
-normale Speicherbereiche wobei es einen Read und einen Write Speicher gibt; Alle Threads dürfen lesen, nur einer darf schreiben

Vielleicht kannst du uns ein paar mehr Infos geben :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

xardias

Community-Fossil

  • »xardias« ist der Autor dieses Themas

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

5

17.06.2008, 18:00

Jupp, Speicher für jeden Thread einzeln macht selbstverständlich Sinn.. im Normalfall. Doch mein Ziel ist es die Auswirkungen des Zugriffs auf den Speicher des anderen Prozessors zu messen.

Vor allem wenn es darum geht von den Cell SPEs von CPU1 auf den Speicher von CPU0 zuzugreifen. Ich würde da halt gerne messen wie viel langsamer der Speichertransfer ist.

Elegant wäre es da eben wenn ich zur Laufzeit des Programms festlegen könnte auf welchen Speicher ich zugreife. Alternativ müsste ich das Messprogramm per numactl komplett auf den anderen Speicher pinnen, was auch funktioniert, aber weniger flexibel ist.

Warum will ich das messen? Ich schreibe in meiner Studienarbeit über den Vergleich der Speichergeschwindigkeiten zwischen den verschiedenen Cell Modellen (PS3, QS20/21).

PS: Ich versuche morgen früh eine Implementierung über CPU Node gepinnte Threads, in der Hoffnung, dass der Speicher direkt mit gepinnt wird.

Werbeanzeige