Ci sono alcune opzioni per l'acquisizione di un blocco di memoria allineato, ma sono molto simili e il problema si riduce in gran parte a quale standard e piattaforme di linguaggio si sta prendendo di mira.Perché usare _mm_malloc? (al contrario di _aligned_malloc, alligned_alloc, o posix_memalign)
C11
void * aligned_alloc (size_t alignment, size_t size)
POSIX
int posix_memalign (void **memptr, size_t alignment, size_t size)
di Windows
void * _aligned_malloc(size_t size, size_t alignment);
E naturalmente è anche sempre un'opzione per allineare a mano.
Intel offre un'altra opzione.
Intel
void* _mm_malloc (int size, int align)
void _mm_free (void *p)
Basato sul codice sorgente rilasciato da Intel, questo sembra essere il metodo di ripartizione di memoria allineato i loro ingegneri preferiscono ma non riesco a trovare alcuna documentazione paragonandolo ad altri metodi. Il più vicino che ho trovato riconosce semplicemente che esistono altre routine di allocazione della memoria allineate.
Per assegnare dinamicamente un pezzo di memoria allineato, uso posix_memalign, che è supportato da GCC, nonche l'Intel compilatore. Il vantaggio di utilizzarlo è che non è necessario modificare l'API di eliminazione della memoria. Puoi usare free() come fai sempre. Ma fai attenzione al profilo dei parametri :
int posix_memalign (void ** memptr, size_t align, size_t size);
Il Compilatore Intel fornisce anche un altro set di allocazione di memoria API. I programmatori C/C++ possono utilizzare _mm_malloc e _mm_free per allocare e blocchi di memoria allineati liberi. Ad esempio, la seguente istruzione richiede un blocco di memoria allineato a 64 byte per 8 elementi in virgola mobile .
farray = (float *) __ mm_malloc (8 * sizeof (float), 64);
La memoria assegnata utilizzando _mm_malloc deve essere liberata utilizzando _mm_free. Chiamare gratuitamente sulla memoria allocata con _mm_malloc o chiamare _mm_free sulla memoria allocata con malloc risulterà in un comportamento imprevedibile.
Gli evidenti differenze da un punto di vista dell'utente è che _mm_malloc
richiede CPU diretta e supporto compilatore e memoria allocata con _mm_malloc
devono essere liberate con _mm_free
. Considerati questi inconvenienti, qual è la ragione per cui si usa sempre _mm_malloc?
Può avere un leggero vantaggio in termini di prestazioni? Incidente storico?
Hai letto tutto il documento che colleghi? Non ti aspetti che lo riassumiamo, vero? – alk
@alk Non c'è motivo di essere scortesi. Se la risposta è ovvia per te, per favore spiega. – Praxeolitic
Potrebbe sembrare scortese, non è inteso in questo modo. È una domanda, probabilmente un po 'sarcastica. – alk