【发布时间】:2013-08-26 12:16:01
【问题描述】:
我有一个包含体积数据的线性数组。数据是灰度级的,即从 0 到 255 的整数值。
int width = 100;
int height = 100;
int depth = 100;
int *texture3DVolume = new int[width*height*depth];
memset(texture3DVolume,0,sizeof(int)*width*height*depth);
我正在用恒定值的球形区域填充数组的某些部分:
int radius= 5;
int radius2=radius*radius;
int centerx = // some value in [5-95]
int centery = // some value in [5-95]
int centerz = // some value in [5-95]
int cxmin=centerx-radius;
int cxmax=centerx+radius;
int cymin=centery-radius;
int cymax=centery+radius;
int czmin = centerz-radius;
int czmax = centerz+radius;
for ( int x= cxmin; x<cxmax; x++)
{
int x2 = (x-centerx)*(x-centerx);
for ( int y=cymin; y<cymax; y++)
{
int x2y2= x2+(y-centery)*(y-centery);
int slice = textureSizeX* y + x;
for ( int z=czmin; z<czmax; z++)
{
int x2y2z2 = x2y2+(z-centerz)*(z-centerz);
if ( x2y2z2 < radius2 )
{
texture3DVolume[ txty*z+slice]=255;
}
}
}
}
这里的问题是我需要访问线性数组来增强缓存的局部性。我认为这种方法虽然正确并不是最快的,因为在z 的内部循环中,我需要遍历连续的值,在我的情况下不是因为txty*z jump 为每个txty 的迭代。
我应该如何修改循环以增强数据访问局部性?
【问题讨论】:
-
txty和textureSizeX分配给什么? -
与您的问题不太相关,但如果您只有 0 到 255 之间的值,您可以考虑使用
char而不是int(或某种 int8)。 -
txty=width*height和textureSizeX=width这只是一个让问题更简单的命名约定。我改变了循环嵌套,使 x 循环位于最里面,速度提高了 2 倍!
标签: c++ loops optimization memory-management