Oto kod normalnie korzystać, aby dostosować pamięć z Visual Studio i GCCnajlepszą metodą cross-platform, aby dostosować pamięć
inline void* aligned_malloc(size_t size, size_t align) {
void *result;
#ifdef _MSC_VER
result = _aligned_malloc(size, align);
#else
if(posix_memalign(&result, align, size)) result = 0;
#endif
return result;
}
inline void aligned_free(void *ptr) {
#ifdef _MSC_VER
_aligned_free(ptr);
#else
free(ptr);
#endif
}
jest ten kod grzywny w ogóle? Widziałem także ludzi używających _mm_malloc
, _mm_free
. W większości przypadków potrzebuję wyrównanej pamięci, aby używać SSE/AVX. Czy mogę ogólnie korzystać z tych funkcji? Ułatwiłoby to mój kod.
Wreszcie, łatwo jest utworzyć własną funkcję wyrównywania pamięci (patrz poniżej). Dlaczego więc istnieje tak wiele różnych wspólnych funkcji, aby uzyskać wyrównaną pamięć (wiele z nich działa tylko na jednej platformie)?
Ten kod wykonuje wyrównanie 16 bajtów.
float* array = (float*)malloc(SIZE*sizeof(float)+15);
// find the aligned position
// and use this pointer to read or write data into array
float* alignedArray = (float*)(((unsigned long)array + 15) & (~0x0F));
// dellocate memory original "array", NOT alignedArray
free(array);
array = alignedArray = 0;
Patrz: http://www.songho.ca/misc/alignment/dataalign.html i How to allocate aligned memory only using the standard library?
Edit: W przypadku ktoś obchodzi, mam pomysł dla funkcji z Eigen moim aligned_malloc() (Eigen/src/Rdzeń/util/Memory.h)
Edytuj: Właśnie odkryłem, że posix_memalign
jest niezdefiniowany dla MinGW. Jednak _mm_malloc
działa dla Visual Studio 2012, GCC, MinGW i kompilatora Intel C++, więc wydaje się być najbardziej wygodnym rozwiązaniem w ogóle. Wymaga to również użycia własnej funkcji _mm_free
, chociaż w niektórych implementacjach można przekazywać wskaźniki od _mm_malloc
do standardu free
/delete
.
Chociaż "unsigned long" obsada adresu może działać w praktyce, może nie być przenośny między modelami danych ILP32/LP64/LLP64 (win64). –