如何使用 posix_memalign 动态分配 64B 对齐的 2D 指针数组

Posted

技术标签:

【中文标题】如何使用 posix_memalign 动态分配 64B 对齐的 2D 指针数组【英文标题】:How to dynamically allocate 2D array of pointer that's 64B aligned using posix_memalign 【发布时间】:2021-12-08 10:34:21 【问题描述】:

我有两个数组,y_train 是一维数组,x_train 是二维数组。我需要使用 posix_memalign 动态分配这两个数组。 我为y_train 正确地做到了这一点。我将int y_train[4344] 转换为以下代码。

   int* Y_train;
posix_memalign((void**)(&Y_train), 64, sizeof(int) * 4344);

现在,我想以同样的方式转换int x_train[4344][20];,但不确定如何。

【问题讨论】:

【参考方案1】:

获取完整大小的内存块,并将其分配给正确类型的指针:

void *ptr;
posix_memalign(&ptr, 64, sizeof(int) * 4344);
int *Y_train = (int*)ptr;
posix_memalign(&ptr, 64, sizeof(int) * 20 * 4344);
int (*x_train)[20] = (int (*)[20])ptr;

现在整个二维数组都正确对齐,但并非所有内部数组都正确对齐,因为20 * sizeof(int) 不是64 的倍数。

当您需要20ints 的每个内部数组正确对齐时,您必须添加填充字节12ints,然后每个内部数组都有128 字节。

posix_memalign(&ptr, 64, sizeof(int) * 32 * 4344);
int (*x_train)[32] = (int (*)[32])ptr;

忽略最后一个12ints。

【讨论】:

非常感谢您的回复。一维图呢int* Y_train; posix_memalign((void**)(&Y_train), 64, sizeof(int) * 4344); 对吗?? 能否请您也用一维数组更新您的答案 “但只有每隔一个内部数组正确对齐,因为 4344 * sizeof(int) 不是 64 的倍数”是什么意思。 ??? 是的,C++ 需要演员表,我添加了它。对不起。 你可以把函数改成void split_dataset(int fold, int (* X_train)[20], int* Y_train),用split_dataset(5, x_train, Y_train);调用

以上是关于如何使用 posix_memalign 动态分配 64B 对齐的 2D 指针数组的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 posix_memalign() 函数

posix_memalign 有对应的 c++ 吗?

堆分配变量的结构成员对齐

sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项

内存写入性能 - GPU CPU 共享内存

我们啥时候需要使用 posix_memalign 而不是 malloc?