C/C++ 多数组索引

问题描述 投票:0回答:1

C/C++ -> 由于内存页面读取/加载,使用 ROW-major 索引以获得更好的性能 (DRAM 电容器、感应放大器和列解码器设计使读取行的效率更高)

for (;xrow<2;xrow++){
for (;ycol < 10;ycol++){
   MdimArr[xrow][ycol]; // performs Some operations
}
}

给定一个多维数组(下面使用 3 维数组),什么是“最佳读取”访问模式?我不关心缓存共享/一致性,因为计算值将被写入另一个内存

我的逻辑: j -> 索引到行 (dim1) 中,然后通过相邻列进行 x (4*3) 循环,同时保持在同一行上。

我对高亮度阵列的做法是否正确?

uint32_t MultiDim[3][4][3] {
        {{0x93e,0xbed,0xced},{0xfed,0xaed,0x1ed},{0x7ea,0x1ea,0x93d},{0xed,0x7be,0x2ed}},
        {{0x2ec,0x8ed,0x123},{0x459,0x3dc,0xc3d},{0xa3e,0xb3d,0x123},{0x7e3,0xcad,0x821}},
        {{0xed1,0x721,0x389},{0xbed,0x921,0x282},{0x13e,0x25d,0x7d3},{0x127,0x63e,0x238}},
    };

    for (uint8_t j = 0;j < 2;){
        for (uint8_t x = 0;x < 11;){
            std::cout << *(MultiDim[j][x]) << " Testing array indexing " << std::endl;
            x++;
            continue;
        }
        j++;
        continue;
    }

尝试查看其他示例,但无法解决问题,因为这些解释对我来说不清楚。

c++ memory-management
1个回答
0
投票

我对高亮度阵列的做法是否正确?

不,但你已经成功了一半。技巧是当您需要 1d 或 2d 访问时使用

reinterpret_cast
创建参考。

此外,使用这种技术,您不需要使用

*
“取消引用”任何指针。

为了演示这一点,我使用了一个具有顺序值的数组:0、1、2……这样,我可以输出它,并快速确定是否以正确的顺序访问数组元素。

#include <cstddef>
#include <iostream>

int main()
{
    enum : std::size_t { M = 3, N = 4, O = 3 };

    using arrayO = uint32_t[O];
    using arrayNO = uint32_t[N * O];
    using arrayMNO = uint32_t[M * N * O];

    using MultiDim1d_t = arrayMNO;
    using MultiDim2d_t = arrayNO[M];
    using MultiDim3d_t = arrayO[M][N];

    // The "real" array is "three dimensional."
    // It could also be declared as: 
    // 
    //      MultiDim3d_t MultiDim;

    uint32_t MultiDim[M][N][O]
    {
         0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 
        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
    };

    // Define references for 1d and 2d access.
    auto MultiDim1d{ reinterpret_cast< MultiDim1d_t& >(MultiDim) };
    auto MultiDim2d{ reinterpret_cast< MultiDim2d_t& >(MultiDim) };

    std::cout << "One-dimensional access\n";
    for (std::size_t mno{}; mno < M * N * O; ++mno)
        std::cout << MultiDim1d[mno] << ' ';
    std::cout << "\n\n";

    std::cout << "Two-dimensional access\n";
    for (std::size_t m{}; m < M; ++m)
        for (std::size_t no{}; no < N * O; ++no)
            std::cout << MultiDim2d[m][no] << ' ';
    std::cout << "\n\n";

    std::cout << "Three-dimensional access\n";
    for (std::size_t m{}; m < M; ++m)
        for (std::size_t n{}; n < N; ++n)
            for (std::size_t o{}; o < O; ++o)
                std::cout << MultiDim[m][n][o] << ' ';
    std::cout << "\n\n";

    return 0;
}

这是输出:

One-dimensional access
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Two-dimensional access
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Three-dimensional access
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
© www.soinside.com 2019 - 2024. All rights reserved.