0

ボリューム データを含む線形配列があります。データはグレーレベル、つまり 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 txty

データ アクセスの局所性を高めるには、ループをどのように変更すればよいですか?

4

1 に答える 1

1

std::array可能であれば、を使用する必要があります

array<array<array<int, 100>, 100>, 100> texture3DVolume;

次に、最も内側の座標が最も内側のループでもあるように、ループを記述する必要があります。最小値と最大値が取得した配列の境界内にあることを確認したと仮定します。たとえば、次のようになります。

for (size_t z=czmin; z<czmax; ++z)
{
    for (size_t y=cymin; z<cymax; ++y)
    {
        for (size_t x=cxmin; z<cxmax; ++x)
        {
            texture3DVolume[z][y][x] = 255;
        }
    }
}
于 2013-08-26T12:33:41.887 に答える