Как выделить 16-байтовые данные, выровненные по памяти

Я пытаюсь реализовать SSE-векторизацию фрагмента кода, для которого мне нужно, чтобы мой одномерный массив был выровнен по 16-байтовой памяти. Тем не менее, я пробовал несколько способов выделить 16-байтовые данные, выровненные по памяти, но в итоге они были выровнены по 4-байтовой памяти.

Мне приходится работать с компилятором Intel icc. Вот пример кода, который я тестирую:

  #include <stdio.h>
  #include <stdlib.h>

  void error(char *str)
  {
   printf("Error:%s\n",str);
   exit(-1);
  }

  int main()
  {
   int i;
   //float *A=NULL;
   float *A = (float*) memalign(16,20*sizeof(float));

   //align
   // if (posix_memalign((void **)&A, 16, 20*sizeof(void*)) != 0)
   //   error("Cannot align");

    for(i = 0; i < 20; i++)
       printf("&A[%d] = %p\n",i,&A[i]);

        free(A);

         return 0;
   }

Вот результат, который я получаю:

 &A[0] = 0x11fe010
 &A[1] = 0x11fe014
 &A[2] = 0x11fe018
 &A[3] = 0x11fe01c
 &A[4] = 0x11fe020
 &A[5] = 0x11fe024
 &A[6] = 0x11fe028
 &A[7] = 0x11fe02c
 &A[8] = 0x11fe030
 &A[9] = 0x11fe034
 &A[10] = 0x11fe038
 &A[11] = 0x11fe03c
 &A[12] = 0x11fe040
 &A[13] = 0x11fe044
 &A[14] = 0x11fe048
 &A[15] = 0x11fe04c
 &A[16] = 0x11fe050
 &A[17] = 0x11fe054
 &A[18] = 0x11fe058
 &A[19] = 0x11fe05c

Он каждый раз выравнивается по 4 байтам, я использовал как memalign, так и posix memalign. Поскольку я работаю в Linux, я не могу использовать _mm_malloc и не могу использовать _aligned_malloc. Я получаю сообщение об ошибке повреждения памяти, когда пытаюсь использовать _aligned_attribute (я думаю, что он подходит только для gcc).

Может ли кто-нибудь помочь мне в точной генерации 16-байтовых данных, выровненных по памяти, для icc на платформе Linux.

12
задан PGOnTheGo 18 June 2012 в 13:59
поделиться