如何使用 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
的倍数。
当您需要20
int
s 的每个内部数组正确对齐时,您必须添加填充字节12
int
s,然后每个内部数组都有128
字节。
posix_memalign(&ptr, 64, sizeof(int) * 32 * 4344);
int (*x_train)[32] = (int (*)[32])ptr;
忽略最后一个12
int
s。
【讨论】:
非常感谢您的回复。一维图呢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 指针数组的主要内容,如果未能解决你的问题,请参考以下文章