Ich bin mir nicht sicher wie genau eine solche Schleife bei Parallelisierung auf einem 2-CPU-System abgearbeit wird, aber mein Tipp wäre, daß es bei der abwechselnden Variante (1 Prozessor ungerade, der andere die geraden Indizes) zur Überlappung beim Speicherzugriff kommt, da aufgrund des Shared Memorys beide Prozessoren denselben Speicherbereich bearbeiten.
Das Problem hierbei ist:
Wenn Prozessor1 gerade den Wert von A[i] in den Speicher schreibt kann Prozessor2 zurselben Zeit nicht den Wert von A[i+1] auslesen und muss warten bis Prozessor1 mit dem Schreiben fertig ist. (Da Prozessor1 die "Leitung" zum RAM blockiert)
Arbeiten beide CPUs auf einem jeweils festem Bereich des Arrays ist es vorstellbar, daß der C-Compiler entsprechend optimiert und die zu bearbeitenden Segmente des Arrays jeweils in großen Brocken im Cache des Prozessors zwischengespeichert werden. Dadurch können beide Prozessoren gleichzeitig große Teile des Arrays bearbeiten ohne sich beim Speicherzugriff in den Weg zu kommen.
Beim Einkernprozessor ist es vermutlich ebenso die fehlende Optimierung über den Cache die zu einer minimalen Verlangsamung führt, da die CPU bei jedem durchlauf zwischen "lesen" und "schreiben" hin und herschalten muss anstatt einmal einen großteil in den Cache laden und später einmal große Datenmengen aus dem Cache in den RAM schreiben.
Bei einem sehr großen Array kann sich dieser minmale Zeitverlust vermutlich zu bemerkbaren Verzögerungen aufsummieren.
Diese Antwort lasse ich als richtig gelten. Magor ist dran.
Hier die genaue Aufloesung:
Prozessoren greifen nicht direkt auf den RAM zu, sondern haben idR zwei Cache Level, ueber die sie gehen. Das heisst, will man ein einzelnes Byte aus dem RAM holen, so wird zuerst ein grosser RAM Block (Eine sogenannte Cache Line) in den Second Level Cache geladen. Ein kleiner Ausschnitt daraus wird dann in den First Level Cache geladen, und das einzelne Byte von dort in ein Register der CPU. Brauch man nun das Byte neben dem zuvor geladenen Speicher, so befindet es sich bereits im Cache und kann schnell geladen werden. Das hat entscheidende Geschwindigkeitsvorteile, denn ein Zugriff auf den L1 Cache kann in ca 10 Prozessorcycles erfolgen, Zugriff auf L2 dauert bereits etwa 100 Zyklen und direkter Zugriff auf den RAM laesst die CPU auch schon mal gerne 1000 Zyklen warten.
Warum nun also die Verzoegerung auf dem Zweiprozessorsystem ? Ganz einfach: Jede der zwei CPUs hat mindestens einen einzigen L1 Cache. Im Fall das der eine gerade und der andere ungerade Indices bearbeitet passiert folgendes. Beide Prozessoren kopieren zu begin den selben Speicherinhalt in ihren Cache. Der erste Prozessor 1 (P1) liest nun seine Speicheraddresse und veraendert ihren Inhalt. P2 tut das selbe, muss aber feststellen, das P1 schon Daten in der selben Cache Line geaendert hat, also muss er die Cach Line aus dem Cache von P1 erst in den Cache von P2 kopieren, seinen Index laden und veraendern. Nun sieht aber P1 das die Cache Line veraendert wurde, usw ...
Im Falle des Einprozessorsystems und der falschen Schleifenanordnung ist es sehr aehnlich: nehmen wir folgenden einfachen C-Code:
C speichert mehrdimensionale Arrays zeilenweise ab. Das heisst, das im Speicher zuerst alle Elemente fuer y=0 stehen, danach die Elemente fuer y=1 usw. (In Fortran ist es z.B. genau andersrum). Dadurch das aber y in der inneren Schleife steht, muss jedes Mal eine andere Zeile in den Cache kopiert werden. Allein durch das Vertauschen der beiden Schleifen kann der Code bis zu acht mal schneller ausgefuehrt werden, da dann die Elemente jeder Zeile bereits im Cache stehen und auch verwendet werden koennen.
dead_orc: Ich habe die Diskussion zu dieser Aussage mal hierhin ausgelagert.
Hm, gerade das mit den 2D-Arrays in C ist sehr interessant, die kleinen Optimierungsmöglichkeiten die man hat wenn man weiß wie das ganze im Hintergrund abläuft. =)
Ich freue mich einfach mal hier auch mal was richtig gewußt zu haben und notiere mir dafür einen Gummipunkt. *notier*
Da ich keinerlei Ideen für passende Fragen/Rätseln habe gibt es eine erneute Freirunde.
Einfach damit das hier nicht einschläft mal wieder eine etwas einfachere Frage:
Was gibt der "Load" auf UNIX-Systeme an? (Lässt sich z.B. durch den Befehl uptime oder cat /proc/loadavg anzeigen)
Das war iirc die Auslastung des Systems. Ich weiß aber nicht mehr, wie der berechnet wird. Wahrscheinlich aus CPU Auslastung, Speicherverbrauch, offenen Prozessen und irgendwelchen anderen obskuren Daten
Edit:
Schade, aber ich bin ja auch ein böser Windowsuser, ich muss das nicht wissen :P
--
Geändert von Manni (26.05.2008 um 18:07 Uhr)
Immerhin etwas, aber ich denke, das ist offensichtlich.
Schade, genau das wollte ich eigentlich wissen.Zitat
OK, damit hast du dich disqualifiziert.Zitat
Edit: Schade, dass es keine Antworten gab.
Als Auflösung die Kurzfassung: Der "Load" bzw. "Load Average" oder deshalb auch kurz LA gibt die durchschnittliche Länge der Run Queue des Prozessors über einen Zeitraum an. Die erste Zahl ist innerhalb der letzten Minute, die zweite innerhalb der letzten 5 Minuten und die letzte schließlich in den letzten 15 Minuten. Lustigerweise habe ich heute grade nen Artikel über UNIX Load Average gefunden, wer sich also noch informieren will, kann das da tun.![]()
Geändert von dead_orc (30.05.2008 um 12:57 Uhr)
Ein Fedora ist ein Hut (so ein Ding das die Leute in alten Gangsterfilmen tragen... dieses Typische Privatdetektiv-Ding, dazu passend einen Trenchcoat, Zigarre & co.... mir fällt grad ein... indy hat auch sowas in der Art an...)
edit:
Ok, Indy hat nicht nur sowas in der art an. Egal. Da es DFYX noch nicht als Antwort ausreicht, weiter gehts.
--
cats are not characteristically disposed toward voluntary aerobic exercise
Geändert von FF (02.06.2008 um 20:29 Uhr)
Logo von Red Hat(Distri) -> roter Fedora(Hut) und Fedora(Distri) stammt von Red Hat(Distri) ab.
Geändert von Drakes (02.06.2008 um 21:08 Uhr)
Dann machen wir gleich in diese Runde weiter, was heisst das Wort "Buch" in der Sprache der 'Ubuntus'? Nicht ne Wissensfrage, aber auch nicht einmal Google und fertig(extra undeutliche Fragestellung)
Ubuntu kommt aus der Sprache der Xhosa bzw. Zulu
Es bedeutet soviel wie Gemeinsinn.
Das Xhosa'sche Wort für Buch wäre "incwadi"
--Actually in Progress
Philip Sparke - Euphonium Concerto
Posaune - C Dur
Brainstar: Gnah. Ich habs zuvor im IRC gepostet, und nicht hier. Und jetzt warst du auch noch schneller T_T
--
cats are not characteristically disposed toward voluntary aerobic exercise
*sigh* So wird das hier nie was.
Was ist der (die) Unterschied(e) zwischen Symlinks unter UNIX und Verknüpfungen unter Windows?
Zusatzfrage: Was ähnelt den Verknüpfungen mehr?
Symlinks werden auf Dateisystemebene verarbeitet, Windows-Verknüpfungen sind vom Explorer verwaltete normale Files. Oder so.
Wenn's richtig ist, Freirunde.
Genau das wollte ich hören.
Das sind natürlich die *.desktop Dateien, wie sie z.B. unter Ubuntu in /usr/share/applications liegen. Sie werden im Prinzip genau so verwendet ("Startmenü"-Einträge, Desktop-Icons, ...), können aber wesentlich mehr Informationen enthalten. (etwa mehrsprachige Titel)
Zitat
Es suggeriert, wie in Ruby, die selbe Methode der Superklasse aufzurufen; tatsächlich ruft es aber nur die nächste Methode in der MRO (Method Resolution Order - afaik) auf.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!Now all new and shiny:CherryShare | Patches und Tools | Programmwunschthread | www.cherrytree.at | Cherry = CherryDT