Sehr schnelles Memcpy für die Bildverarbeitung?

Lesezeit: 3 Minuten

Benutzeravatar von horseyguy
Pferdetyp

Ich mache eine Bildverarbeitung in C, bei der große Datenmengen im Speicher kopiert werden müssen – Quelle und Ziel überlappen sich nie.

Was ist der absolut schnellste Weg, dies auf der x86-Plattform zu tun? GCC (wo SSESSE2 aber NICHT SSE3 sind verfügbar)?

Ich gehe davon aus, dass die Lösung entweder in Assembly oder unter Verwendung von GCC-Intrinsics sein wird?

Ich habe den folgenden Link gefunden, habe aber keine Ahnung, ob dies der beste Weg ist (der Autor sagt auch, dass er ein paar Fehler enthält): http://coding.derkeiler.com/Archive/Assembler/comp.lang.asm.x86/2006-02/msg00123.html

EDIT: Beachten Sie, dass eine Kopie erforderlich ist, ich komme nicht darum herum, die Daten zu kopieren (ich könnte erklären, warum, aber ich erspare Ihnen die Erklärung :))

  • Können Sie Ihren Code so schreiben, dass die Kopie gar nicht erst benötigt wird?

    – Ron

    11. November 2009 um 13:44 Uhr

  • Wenn Sie den Intel-Compiler in die Finger bekommen, haben Sie möglicherweise bessere Chancen, dass der Optimierer in Vektor-CPU-Anweisungen konvertiert

    – David Rodríguez – Dribeas

    11. November 2009 um 13:54 Uhr

  • Schau dir das an: software.intel.com/en-us/articles/memcpy-performance

    – David Rodríguez – Dribeas

    11. November 2009 um 13:58 Uhr

  • Wissen Sie, um wie viel zu langsam memcpy() Ihres Compilers ist? Können Sie angeben, auf welchem ​​Prozessor der Code ausgeführt wird? Und welches Betriebssystem?

    – Clifford

    11. November 2009 um 14:02 Uhr

  • Ich nehme an, dass Sie erkennen, dass es hilfreich ist, die Speicherblöcke auf 16 Byte ausgerichtet zu halten. Oder, wenn sie nicht 16-Byte-ausgerichtet sind, behandeln Sie die ersten paar und letzten paar Bytes als Sonderfall und kopieren Sie den Rest des Blocks auf 16-Byte-ausgerichtete Grenzen.

    – Michael Dillon

    11. November 2009 um 14:16 Uhr

  • Hinweis: Die Leistung dieser Speicherkopie hängt stark von der zu kopierenden Datenmenge und der Cache-Größe ab. Zum Beispiel können Vorabrufe und nicht-temporale Bewegungen die Leistung für kleinere (in L2 passende) Kopien im Vergleich zu regulären Movdqas beeinträchtigen.

    – Raphaël Saint-Pierre

    11. November 2009 um 14:39 Uhr

  • Geländer: vergiss nicht, ihm zu mailen, dass du seinen Code in deinem Projekt verwendet hast 😉 [ williamchan.ca/portfolio/assembly/ssememcpy/source/… ]

    – ardsrk

    11. November 2009 um 14:48 Uhr

  • Ich erinnere mich, diesen Code zuerst in einem AMD64-Handbuch gelesen zu haben. Und der Code ist auf Intel nicht optimal, wo es Cache-Bank-Aliasing-Probleme gibt.

    – Günther Piez

    29. November 2009 um 10:33 Uhr

  • Ich habe gerade eine Antwort gepostet, in der es um die Bandbreite des Arbeitsspeichers geht. Wenn das, was ich sage, wahr ist, dann glaube ich nicht, dass die DMA-Engine viel über das hinaus erreichen kann, was die CPU erreichen kann. Habe ich etwas verpasst?

    – Andrew Bainbridge

    15. August 2013 um 11:02 Uhr

  • Dein Denkprozess ist gut. Allerdings fehlt es an Vermarktungszahlen von RAM, das sind alles Quad-Pumped-Zahlen, die nicht der Geschwindigkeit von 1 Kanal entsprechen. Und es ist auch die Geschwindigkeit vor dem Bus, es gibt Verwaltungs-Overheads auch im Numa-Modell, das Core i7/Opterons haben.

    – v.oddou

    30. Oktober 2013 um 8:03 Uhr

  • Können Sie auf eine bestimmte DMA-Engine hinweisen, die möglicherweise in einem modernen x86-System zu finden ist und Speicher schneller kopieren kann als ein CPU-Kern mit SSE oder AVX? PCIe 3.0 mit einem x16-Link ist nur 15,75 GB/s möglich, im Vergleich zu Dual-Channel DDR4 2133 MT/s (z. B. eine Skylake-CPU von 2015), was eine theoretische Bandbreite von 34 GB/s ergibt. Daher müsste jede solche DMA-Engine enger an die CPU angeschlossen werden. Beachten Sie, dass die Speichercontroller in die CPU integriert sind, sodass jede Off-Chip-DMA-Engine auf modernen x86 über die CPU zum Speicher gelangen muss.

    – Peter Cordes

    18. November 2020 um 22:06 Uhr


  • Ein einzelner Kern eines Intel-Desktop-/Laptop-Chips kann die DRAM-Bandbreite fast sättigen (im Gegensatz zu einem Xeon mit vielen Kernen). Warum ist Skylake beim Singlethread-Speicherdurchsatz so viel besser als Broadwell-E? / Verbessertes REP MOVSB ​​für memcpy

    – Peter Cordes

    18. November 2020 um 22:08 Uhr

1389710cookie-checkSehr schnelles Memcpy für die Bildverarbeitung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy