我想使用memalign
16B 而不是仅使用malloc
.
我有
A =(float **) malloc( (*dim) * sizeof(float*));
for ( i = 0 ; i < (*dim) ; i++) {
A[i] = (float*) malloc(sizeof(float)*(*dim));
}
如何更改上面的代码memalign
。
我想使用memalign
16B 而不是仅使用malloc
.
我有
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));
这将为您生成一个长度为 dim^2 个元素的一维数组。这就是 C/C++ 中通常使用 2D 数组的方式(除非您有特定原因使用指向其他数组的指针数组)。
我假设您希望将此数组输入到某个 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 访问数组 aMemory,如
// A[row][column]
A[0][0] = 0.0f;
A[1][1] = 1.0f;
等等