【发布时间】:2014-04-23 21:45:56
【问题描述】:
鉴于我有以下结构的两个平行且大小相同的数组:
struct Matrix
{
float data[16];
};
struct Vec4
{
float data[4];
}
//Matrix arrM[256]; //for illustration
//Vec4 arrV[256];
假设我希望尽可能快地依次迭代这两个数组。假设函数类似于:
for (int i=0; i < 256; ++i)
{
readonlyfunc(arrMPtr[i].data);
readonlyfunc(arrVPtr[i].data
}
假设我的分配对于每个数组都是对齐的,无论是在静态分配内存还是堆内存的情况下。假设我的缓存行大小为 64 字节。
如果我将数据存储为,我能否获得相同的缓存位置和性能:
一)
//aligned
static Matrix arrM[256];
static Vec4 arrV[256];
Matrix* arrMPtr = arrM[0];
Vec4* arrVPtr = arrV[0];
对比
B)
//aligned
char* ptr = (char*) malloc(256*sizeof(Matrix)+256*sizeof(Vec4));
Matrix* arrMPtr = (Matrix*) ptr;
Vec4* arrVPtr = (Vec4*) ptr+256*sizeof(Matrix);
【问题讨论】:
-
可能没有区别,两者(静态或动态内存)将以相同的方式访问(通过指针)
-
这两个静态数组是否相对于彼此是连续的?顺序呢,有关系吗?
-
single 访问并不完全相同,但对于这样的循环,我怀疑会有可测量的差异。
-
@skimon:它们可以“任意”分配,所以不,你不能假设它们是连续的(我不明白为什么会重要)。订单是什么意思?
-
如果不知道更多关于你在做什么,就不可能说出来。请记住,静态数组可能已经在 L1 缓存中(在您的情况下,256 个矩阵和向量将适合 32kb 缓存),而从堆分配的数组必须读入 L1 缓存。
标签: c++ caching memory-management