Estoy tratando de implementar la vectorización de SSE en un fragmento de código para el que necesito que mi matriz 1D esté alineada con 16 bytes de memoria. Sin embargo, he intentado varias maneras de asignar datos alineados en 16 bytes de memoria, pero termina siendo de 4 bytes de memoria alineada.Cómo asignar datos de memoria de 16 bytes
Tengo que trabajar con el compilador Intel icc. Este es un ejemplo de código que estoy probando con:
#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;
}
Ésta es la salida me sale:
&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
Se 4byte alineado cada vez, he utilizado tanto memalign, memalign POSIX. Como estoy trabajando en Linux, no puedo usar _mm_malloc ni puedo usar _aligned_malloc. Aparece un error de corrupción de memoria cuando intento usar _aligned_attribute (que es adecuado solo para gcc).
¿Alguien me puede ayudar en la generación precisa de datos alineados de memoria de 16bytes para icc en la plataforma de Linux.
¿Cómo sabes que está alineado en 4 bytes, simplemente porque printf solo está produciendo 4 bytes a la vez? Solo porque está usando la rutina de memalign, la está poniendo en un tipo de flotador. Cuando imprime utilizando printf, sabe cómo procesar a través de su tipo primitivo (float). – trumpetlicks
¿Por qué no puedes usar "_mm_malloc" en Linux? –