16 바이트 메모리를 정렬하려면 1D 배열이 필요한 코드 조각에 SSE 벡터화를 구현하려고합니다. 그러나, 나는 16byte 메모리 정렬 된 데이터를 할당하는 몇 가지 방법을 시도했지만 4byte 메모리가 정렬되게된다.16 바이트 메모리 정렬 된 데이터를 할당하는 방법
Intel icc 컴파일러를 사용해야합니다.
&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을을 사용하고 있습니다 :
#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;
}
이 내가 얻을 출력은 다음과 같습니다 이것은 내가 함께 테스트입니다 샘플 코드입니다. 리눅스에서 작업 할 때 _mm_malloc을 사용할 수없고 _aligned_malloc을 사용할 수 없습니다. _aligned_attribute를 사용하려고 할 때 메모리 손상 오류가 발생합니다 (gcc 만 사용할 때 적합합니다).
누구든지 Linux 플랫폼에서 icc 용으로 16 바이트 메모리 정렬 데이터를 정확하게 생성하는 데 도움을 줄 수 있습니까?
printf가 한 번에 4 바이트 만 출력하기 때문에 4 바이트 정렬이라는 것을 어떻게 알 수 있습니까? 그냥 memalign 루틴을 사용하기 때문에, 당신은 그것을 플로트 타입으로 넣을 것입니다. printf를 사용하여 인쇄 할 때 원시 타입 (float)을 처리하는 방법을 알고 있습니다. – trumpetlicks
Linux에서 "_mm_malloc"을 사용할 수없는 이유는 무엇입니까? –