Warum verwenden Sie _mm_malloc? (im Gegensatz zu _aligned_malloc, alligned_alloc oder posix_memalign)
Gibt es ein paar Optionen für den Erwerb einer angepassten block von Speicher, aber Sie sind sehr ähnlich und das Problem meist darauf an, welche Sprache standard und Plattformen, die Sie sind targeting.
C11
void * aligned_alloc (size_t alignment, size_t size)
POSIX
int posix_memalign (void **memptr, size_t alignment, size_t size)
Windows
void * _aligned_malloc(size_t size, size_t alignment);
Und es ist natürlich auch immer eine option zum ausrichten von hand.
Intel bietet eine weitere option.
Intel
void* _mm_malloc (int size, int align)
void _mm_free (void *p)
Basierend auf der Quell-code veröffentlicht von Intel, scheint dies die Methode der Zuteilung ausgerichtet Gedächtnis Ihrer Ingenieure lieber, aber ich finde keine Dokumentation Vergleich zu anderen Methoden. Die nächsten fand ich einfach anerkennt, dass andere ausgerichtet memory allocation Routinen existieren.
Dynamisch reservieren ein Stück ausgerichtet Speicher posix_memalign,
das wird unterstützt durch GCC sowie dem Intel-Compiler. Nutzen
der Verwendung ist es, dass Sie nicht haben, ändern Sie die Speicher-Entsorgung-API.
Sie können Sie verwenden, free (), wie Sie es immer tun. Aber achten Sie auf die
parameter Profil:int posix_memalign (void **memptr, size_t align, size_t size);
Den Intel-Compiler bietet auch einen anderen Satz von Speicher-Zuordnung
APIs. C/C++ - Programmierer verwenden können, _mm_malloc und _mm_free reservieren
und frei ausgerichtet Speicherblöcke. Zum Beispiel die folgenden
Anweisung fordert eine 64-byte-aligned memory-block für 8-floating-point
Elemente.farray = (float *)__mm_malloc(8*sizeof(float), 64);
Speicher, der reserviert wird, mit _mm_malloc muss freigegeben werden, mit
_mm_free. Berufung auf freien Speicher mit _mm_malloc oder rufen _mm_free auf Speicher mit malloc wird zu unvorhersehbarem Verhalten führen.
Die deutlichen Unterschiede aus der Sicht der Nutzer ist, dass _mm_malloc
erfordert direkte CPU und compiler-Unterstützung und der Speicher mit _mm_malloc
muss freigegeben werden, mit _mm_free
. Angesichts dieser Nachteile, was ist der Grund für immer mit _mm_malloc?
Kann es einen leichten performance-Vorteil? Historischer Unfall?
InformationsquelleAutor der Frage Praxeolitic | 2015-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Intel-Compiler unterstützen POSIX (Linux) und nicht-POSIX - (Windows -) Betriebssystemen daher nicht darauf Vertrauen, dass entweder die POSIX-oder Windows-Funktion. So ein compiler-spezifisch, aber OS-unabhängige Lösung, die gewählt wurde.
C11 ist eine tolle Lösung, aber Microsoft gar nicht unterstützt C99 noch, also wer weiß, ob Sie je Unterstützung C11.
Update: im Gegensatz zu den C11/POSIX/Windows Zuweisung Funktionen, die ICC-Interna gehören ein die Freigabe-Funktion. Dies erlaubt es diese API zu verwenden, einen separaten heap-manager von dem Standardwert. Ich weiß nicht, ob/Wann es tatsächlich tut, aber es kann nützlich sein, um dieses Modell zu unterstützen.
Disclaimer: ich arbeite für Intel, aber haben keine Besondere Kenntnis von diesen Entscheidungen, das geschah lange, bevor ich in die Firma eintrat.
InformationsquelleAutor der Antwort Jeff
_mm_malloc scheint die erstellt wurden, bevor es einen standard aligned_alloc Funktion und die Notwendigkeit der Nutzung _mm_free ist eine Eigenart der Umsetzung.
Meine Vermutung ist, dass-anders als bei posix_memalign, es muss nicht mehr anderweitig zu vergeben, um zu gewährleisten, Ausrichtung, stattdessen verwendet es eine separate Ausrichtung-bewusst-Zuweisung. Das spart Speicher bei der Zuteilung von Arten mit Ausrichtung unterscheidet die Standard-Ausrichtung (typischerweise 8 oder 16 bytes).
InformationsquelleAutor der Antwort Thief
Ist es möglich, eine vorhandene C-compiler, die derzeit nicht passieren, verwenden die Bezeichner
_mm_alloc
und_mm_free
definieren und Funktionen mit diesen Namen, die sich Verhalten, als notwendig. Dies könnte geschehen, entweder, indem er_mm_alloc
Funktion als wrapper aufmalloc()
dem Sie gefragt werden, für eine leicht-oversized-Zuweisung und erstellt einen Zeiger auf das erste entsprechend ausgerichtet-Adresse, die mindestens ein byte von Anfang an, und speichern die Anzahl der bytes, die übersprungen unmittelbar vor dieser Adresse, oder durch_mm_malloc
Anfrage große Teile des Gedächtnisses ausmalloc()
- und dann verzichten Sie Stückwerk. In jedem Fall, wird der Zeiger zurückgegeben_mm_malloc()
würde nicht Hinweise, diefree()
würde in der Regel wissen, wie zu tun, nichts mit; der Aufruf_mm_free
würden mit dem byte unmittelbar vor der Zuweisung als Hilfe für die Suche nach dem wirklichen Beginn der Zuteilung erhielt vonmalloc
und dann übergeben, diefree
.Wenn ein aligned allocate-Funktion darf die Interna der
malloc
undfree
Funktionen, aber, dass kann die Notwendigkeit beseitigen, für die zusätzliche Schicht der Umhüllung. Es ist möglich zu schreiben_mm_alloc()
/_mm_free()
Funktionen, die wrapsmalloc
/free
ohne zu wissen, etwas über Ihre Struktur, aber es erfordert, dass_mm_alloc()
halten, Buchführung Informationen, die getrennt von, dass verwendet, indemmalloc
/free
.Wenn der Autor auf eines ausgerichtet-allocate-Funktion weiß, wie
malloc
undfree
umgesetzt werden, wird es oft möglich sein, koordinieren die Gestaltung aller Zuweisungs - /Freigabefunktionen, so dassfree
können unterscheiden alle Arten von Zuweisungen und entsprechend behandelt. Keine einzige aligned allocate-Implementierung verwendbar für allemalloc
/free
Implementierungen jedoch.Ich würde vorschlagen, dass die meisten tragbaren Weg, um code zu schreiben, würde es wahrscheinlich sein, wählen Sie ein paar Symbole, die nicht anderswo für Ihre eigene Zuweisung und Freigabe von Funktionen, so dass Sie könnte dann sagen, z.B.
auf Compiler, die Unterstützung oder
auf Posix-Systemen, etc. Für jedes system sollte es möglich sein zu definieren, Makros oder Funktionen, die Ausbeute wird das notwendige Verhalten [ich denke, es ist wahrscheinlich besser, verwenden Sie Makros konsequent, als manchmal die Verwendung von Makros und manchmal Funktionen, so dass
#if defined macroname
um zu testen, ob Dinge, die definiert sind, noch].InformationsquelleAutor der Antwort supercat