prefetch ab 3dnow!
-
hallo,
kann mir jemand sagen ob der prefetch befehl (prefetchtx in SSE) irgendwas bringt? ich hab gestern mal einbischen probiert und habe garkeine steigerung bekommen (ich hab eine matrix auf der ich nen array von vektoren transformiere und habe den prefetch befehl fürs laden des nächsten vektors verwendet).
gruss
eviluser
-
ich habe selbst bisher noch kein problem gehabt, bei dem ich ihn sinnvoll hätte einsetzen können. gerade bei arrays, die man von vorne nach hinten durcharbeitet ist es ja gewöhnlich so, dass der prozessor den zugriff auf die nächste cachezeile vorausahnt, lange bevor der entsprechende befehl, der auf diesen speicher zugreift, tatsächlich ausgeführt wird. wirklich bringen wird es vermutlich nur etwas, wenn der zugriff recht wahlfrei und die adressauflösung sonst erst sehr spät erfolgt; oder evtl. in multiprozessorumgebungen, wo ein frühzeitiger zugriff einem möglicherweise blockierten bus zuvorkommt.
-
Der Prozessor ahnt es nicht voraus, aber er hat wahrscheinlich noch eine gut gefüllt Pipeline, wenn er zu lesen anfängt. Ok, er macht schon speculative reads, aber gerade mal ein paar Befehle weit voraus, und da geht's dann auch nur um's nächste Element. Für prefetch braucht man aber eine viel größere Distanz. Es ist nur recht schwierig, die richtige Prefetch-Distanz zu ermitteln. In den Intel Manuals ist das ziemlich intensiv ausgeführt. Schau dort mal nach.
Wenn du aber gar kein Latency-Problem hast, dann kannst du prefetchen bis du alt wirst, und es wird nicht schneller.
-
Das IA-32 Intel Architecture Optimization Reference Manual beschäftigt sich recht ausführlich damit (Abschnitt E):
ftp://download.intel.com/design/Pentium4/manuals/24896611.pdf
-
es heißt, dass in manchen situationen ein explizites prefetch die anwendung sogar langsamer machen könnte, weil der prozessor seine eigene optimierung verwirft. und heutige prozessoren optimieren schon. branch prediction is da das schlagwort. er überlegt sich, wo es im code weiter geht und läd dann die dafür nötigen daten schon vorher in den cache (nicht immer aber meistens). wenn man davon ausgeht, dass man ziemlich unvorhersagbar herumspringt, könnte prefetch sinn machen.
björn