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;
}
尝试查看其他示例,但无法解决问题,因为这些解释对我来说不清楚。
我对高亮度阵列的做法是否正确?
不,但你已经成功了一半。技巧是当您需要 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