1

我想使用memalign16B 而不是仅使用malloc.

我有

A =(float **) malloc( (*dim) * sizeof(float*));
for ( i = 0 ; i < (*dim) ; i++) {

    A[i] = (float*) malloc(sizeof(float)*(*dim));
}

如何更改上面的代码memalign

4

2 回答 2

4

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);
于 2012-09-26T07:13:53.947 回答
2

你在这里拥有的并不是一个真正的二维矩阵,只是一个指向更多一维数组的一维数组。

你想要这样的东西吗?

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;

等等

于 2012-09-26T07:14:05.057 回答