SIMD i typ __m128 - dynamiczny przydzial pamieci

0

Witam

Kiedyś napisałem klasy implementujące wektor i macierz i wykonujące obliczenia a pomocą instrukcji SSE, SSE2, SSE3. Klasy były pisane pod Windowsem i kompilatorem vs2k3, wszystko działało bardzo ładnie.
Teraz jednak gdy chciałem wykorzystać stworzone kiedyś klasy ale pod LINUXem pojawił sie problem dynamicznej alokacji pamięci. Otóż mam tak przeciążone operatory new oraz delete:

void* operator new(size_t size)
    {  return ( _aligned_malloc(size, 16) );   }
void operator delete (void* mem)
    {   _aligned_free(mem);   }

Problem w tym ze pod linuxem nie znajduje _aligned_malloc ( pod windowsem malloc.h ).
Jak zastąpić _aligned_malloc aby alokował pamięć w blokach po 16B ? albo skąd wziąć _aligned_malloc oraz _aligned_free ??

0
void *aligned_malloc(size_t size, size_t align_size) 
{
    char *ptr,*ptr2,*aligned_ptr;
    int align_mask = align_size - 1;

    ptr=(char *)malloc(size + align_size + sizeof(int));
    if(ptr==NULL) return NULL;

    ptr2 = ptr + sizeof(int);
    aligned_ptr = ptr2 + (align_size - ((size_t)ptr2 & align_mask));

    ptr2 = aligned_ptr - sizeof(int);
    *((int*)ptr2)=(int)(aligned_ptr - ptr);

    return aligned_ptr;
}

void aligned_free(void *aligned_ptr) 
{
    int *ptr2=(int*)aligned_ptr - 1;
    aligned_ptr = (char*)aligned_ptr - *ptr2;
    free(aligned_ptr);
}
0

Tak ale czy ten kod który podałeś to nie działa czasem poprawnie tylko na maszynach 32bit'owych ??

0

A co ma piernik do wiatraka?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0