我想分配二維數組(矩陣)使用memalign
與16B而不是僅使用malloc
。如何動態分配16B對齊的二維數組
我
A =(float **) malloc((*dim) * sizeof(float*));
for (i = 0 ; i < (*dim) ; i++) {
A[i] = (float*) malloc(sizeof(float)*(*dim));
}
我如何可以改變上面memalign
代碼。
我想分配二維數組(矩陣)使用memalign
與16B而不是僅使用malloc
。如何動態分配16B對齊的二維數組
我
A =(float **) malloc((*dim) * sizeof(float*));
for (i = 0 ; i < (*dim) ; i++) {
A[i] = (float*) malloc(sizeof(float)*(*dim));
}
我如何可以改變上面memalign
代碼。
隨着malloc()
您需要申請15個額外的字節,然後圍捕返回的指針到16的最接近的倍數,如:
void* p = malloc(size + 15);
void* paligned;
if (!p) { /* handle errors */ }
paligned = (void*)(((size_t)p + 15)/16 * 16);
/* use paligned */
free(p);
你在這裏什麼也算不上一個二維矩陣,只是一維數組指向更多的一維數組。
你想要這樣的東西嗎?
A = (float*) memalign(16, (*dim) * (*dim) * sizeof(float));
這將生成一個暗淡^ 2個元素長的一維數組。這就是二維數組通常在C/C++中使用的方式(除非您有特定的理由使用指向其他數組的指針數組)。
我假設你希望將這個數組加入一些DSP函數 - 在不知道你正在使用的函數的情況下很難知道更多。
如果必須訪問數組A [X] [Y],你可以這樣做:
float *aMemory = (float*) memalign(16, (*dim) * (*dim));
float **A = (float**) malloc(*dim * sizeof(float));
for (i = 0; i < *dim; i++)
{
A[i] = &aMemory[*dim * i];
}
現在,你可以通過指針A的數組訪問數組å存儲,如
// A[row][column]
A[0][0] = 0.0f;
A[1][1] = 1.0f;
等
尼斯,獨立於平臺的答案 –