Warum _mm_malloc verwenden? (im Gegensatz zu _aligned_malloc, alligned_alloc oder posix_memalign)

Lesezeit: 4 Minuten

Benutzeravatar von Praxeolitic
Praxeolit

Es gibt ein paar Optionen, um einen ausgerichteten Speicherblock zu erwerben, aber sie sind sehr ähnlich und das Problem läuft hauptsächlich darauf hinaus, auf welchen Sprachstandard und welche Plattformen Sie abzielen.

C11

void * aligned_alloc (size_t alignment, size_t size)

Posix

int posix_memalign (void **memptr, size_t alignment, size_t size)

Fenster

void * _aligned_malloc(size_t size, size_t alignment);

Und natürlich ist es auch immer möglich, von Hand auszurichten.

Intel bietet eine andere Option an.

Intel

void* _mm_malloc (int size, int align)
void _mm_free (void *p)

Basierend auf dem von Intel veröffentlichten Quellcode scheint dies die von ihren Ingenieuren bevorzugte Methode zum Zuweisen von ausgerichtetem Speicher zu sein, aber ich kann keine Dokumentation finden, die sie mit anderen Methoden vergleicht. Der nächste, den ich gefunden habe, bestätigt einfach, dass andere ausgerichtete Speicherzuweisungsroutinen existieren.

https://software.intel.com/en-us/articles/memory-management-for-optimal-performance-on-intel-xeon-phi-coprocessor-alignment-and

Um ein Stück ausgerichteten Speichers dynamisch zuzuweisen, verwenden Sie posix_memalign, das sowohl von GCC als auch vom Intel Compiler unterstützt wird. Der Vorteil bei der Verwendung besteht darin, dass Sie die Speicherbeseitigungs-API nicht ändern müssen. Sie können free() wie gewohnt verwenden. Aber achten Sie auf das Parameterprofil:

int posix_memalign (void **memptr, size_t align, size_t size);

Der Intel Compiler bietet auch einen weiteren Satz von Speicherzuweisungs-APIs. C/C++-Programmierer können _mm_malloc und _mm_free verwenden, um ausgerichtete Speicherblöcke zuzuweisen und freizugeben. Beispielsweise fordert die folgende Anweisung einen ausgerichteten 64-Byte-Speicherblock für 8 Gleitkommaelemente an.

farray = (float *)__mm_malloc(8*sizeof(float), 64);

Speicher, der mit _mm_malloc zugewiesen wird, muss mit _mm_free freigegeben werden. Das Aufrufen von free für Speicher, der mit _mm_malloc zugewiesen wurde, oder das Aufrufen von _mm_free für Speicher, der mit malloc zugewiesen wurde, führt zu unvorhersehbarem Verhalten.

Die klaren Unterschiede aus Benutzersicht sind die _mm_malloc erfordert direkte CPU- und Compiler-Unterstützung und zugewiesenen Speicher _mm_malloc muss mit befreit werden _mm_free. Was ist angesichts dieser Nachteile der Grund für die Verwendung _mm_malloc? Kann es einen leichten Leistungsvorteil haben? Historischer Unfall?

  • @alk Es gibt keinen Grund, unhöflich zu sein. Wenn die Antwort für Sie offensichtlich ist, dann erklären Sie es bitte.

    – Praxeolit

    16. September 2015 um 15:48 Uhr

  • Es mag unhöflich klingen, so ist es nicht gemeint. Es ist eine Frage, wahrscheinlich ein bisschen sarkastisch.

    – alk

    16. September 2015 um 15:52 Uhr


  • Vielleicht hätte ich besser fragen sollen, warum das Dokument Ihrer Meinung nach Ihre Frage nicht beantwortet…. 😉

    – alk

    16. September 2015 um 15:54 Uhr

  • @alk Hmmm … Ich sehe einfach keine Antwort im verlinkten Dokument … wenn es dort ist, sind mir heute entweder die Augen oder das Gehirn aus dem Kopf gefallen (oder beides). Warte, hast du diese ganze Frage gelesen? Vor allem der letzte Absatz?

    – Praxeolit

    16. September 2015 um 16:00 Uhr


  • Aber Sie haben Recht, das Dokument beantwortet Ihre Frage nicht. Bitte entschuldigen Sie meine Unterstellung. Der interessante Teil betrifft jedoch die Funktionen, die auf die “skalierbaren” Speicherpools zugreifen, die dieselbe Signatur verwenden wie die _mm_*() Funktionen.

    – alk

    16. September 2015 um 16:28 Uhr


  • Oh, huh, das ist in der Tat sehr einfach und macht absolut Sinn! Es ist leicht, kurzsichtig in Bezug auf Ihr eigenes Betriebssystem zu werden und diese Dinge nicht zu erkennen.

    – Praxeolit

    20. September 2015 um 15:04 Uhr

  • Eher das Gegenteil: _mm_malloc könnte arbeiten, indem sie Metadaten überbelegen und vor dem zurückgegebenen Speicher belassen, wodurch sie inkompatibel werden free wenn der Standardzuordner nicht überausrichtungsfähig ist. posix_memalign ist kompatibel mit free das kann es also nicht. man7.org/linux/man-pages/man3/posix_memalign.3.html zeigt, dass unter GNU/Linux alle aligned-alloc-Funktionen kompatibel sind free. Das Veraltete memalign nicht bieten eine garantiert sichere Möglichkeit, den resultierenden Speicher freizugeben, und haben auf einigen Systemen eine Überallokation und Ausrichtung durchgeführt, ohne den Zeiger zu speichern.

    – Peter Cordes

    8. März 2019 um 8:19 Uhr


  • In glibc, _mm_malloc ist buchstäblich als Wrapper-Around definiert posix_memalign (oder malloc zum alignment==1). Aber ja, Ihr allgemeines Argument ist wahr, dass die Nicht-Freiheitskompatibilität darauf zurückzuführen ist, dass Sie auf alten Systemen etwas Besonderes tun müssen. Oder selbst auf modernen Windows ausgerichtete Zuordnungsfunktionen sind immer noch nicht mit free oder delete kompatibel und stürzen tatsächlich ab.

    – Peter Cordes

    8. März 2019 um 8:24 Uhr


1400240cookie-checkWarum _mm_malloc verwenden? (im Gegensatz zu _aligned_malloc, alligned_alloc oder posix_memalign)

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

Privacy policy