私は1次元配列を16バイトメモリに合わせる必要があるコードにSSEベクトル化を実装しようとしています。しかし、私は16バイトのメモリアライメントされたデータを割り当てるいくつかの方法を試しましたが、4バイトのメモリが整列してしまいます。16バイトのメモリアライメントデータを割り当てる方法
私は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だけに適しています)。
Linuxプラットフォームでicc用に16バイトのメモリアラインメントデータを正確に生成するのに助けてくれる人は誰でも助けてくれますか?
printfが一度に4バイトしか出力しないので、それが4バイト整列であることをどのように知っていますか?ちょうどあなたがmemalignルーチンを使用しているので、あなたは浮動小数点型に入れています。 printfを使用して印刷する場合、プリミティブ型(float)を処理する方法を知っています。 – trumpetlicks
Linuxで "_mm_malloc"を使用できないのはなぜですか? –