在c++中为MPI使用平坦化3D数组
Flattening a 3D array in c++ for use with MPI
谁能帮助使用MPI扁平化3D数组的一般格式?我想我可以通过使用(I +xlength*j+xlength*ylength*k)来获得数组1维,但是我在使用引用数组特定单元格的方程时遇到了麻烦。
我试着根据我有多少个处理器将代码分块,但是当我需要另一个处理器拥有的值时,我遇到了困难。是否有一种方法可以使这更容易(和更有效)使用鬼细胞或指针杂耍?
您至少有两个选择。比较简单的方法是声明一个预处理器宏来隐藏索引计算的复杂性,例如:
#define ARR(A,i,j,k) A[(i)*ylength*zlength+(j)*zlength+(k)]
ARR(myarray,i,j,k) = ARR(myarray,i+1,j,k) + ARR(myarray,i,j+1,k) + ...
这是笨拙的,因为宏只能处理固定前导维的数组,例如x ylength
x zlength
。
更好的方法是使用所谓的掺杂向量。向量基本上是大数组的索引。你分配一个大小为xlength * ylength * zlength
的大平面块来保存实际数据,然后创建一个索引向量(实际上是3D情况下的树)。在您的示例中,索引有两个级别:
- 顶层,由指向 的
- 第二级,由
xlength
指针数组组成,每个数组包含指向内存中zlength
元素块开始的ylength
指针。
xlength
指针组成。我们把顶级指针数组命名为A
。然后A[i]
是指向指针数组的指针,该指针数组描述i
-th数据块。A[i][j]
是i
指针数组的j
的第一个元素,它指向data[i][j][0]
(如果data
是一个3D数组)。dope向量的构造类似于这样:
double *data = new double[xlength*ylength*zlength];
double ***A;
A = new double**[xlength];
for (int i = 0; i < xlength; i++)
{
A[i] = new double*[ylength];
for (int j = 0; j < ylength; j++)
A[i][j] = data + i*ylength*zlength + j*zlength;
}
Dope vector和普通数组一样容易使用,只是需要考虑一些特殊的因素。例如,A[i][j][k]
将允许您访问data
所需的元素。对dope vector的一个警告是,顶层由指向其他指针表的指针组成,而不是指向数据本身的指针,因此A
不能用作&A[0][0][0]
的快捷方式,A[i]
也不能用作&A[i][0][0]
的快捷方式。A[i][j]
仍然等同于&A[i][j][0]
。另一个警告是,这种形式的数组索引比普通的3D数组索引慢,因为它涉及指针跟踪。
有些人倾向于为数据和数据向量分配一个存储块。它们只是将索引放在分配块的开头,实际数据在后面。这种方法的优点是,处理数组就像删除整个内存块一样简单,而处理用上一节的代码创建的向量需要多次调用free
操作符。
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 我是 c++ 的新手,有没有一种算法可以找到 3d 数组中最接近的 0 的距离?
- 如何用零填充 3D 数组?
- 将长度可变的 C99 静态 3D 数组传递给函数
- C :将矢量重新为3D数组
- 将动态 3D 数组发送到 C++ 中的函数
- C++ 3D 数组到 1D 会导致堆缓冲区溢出
- 初始化const 3D数组成员变量
- 处理3D数组的边缘和角案例的方法
- 将2D数组的实例分配给3D数组中的索引
- 使用 vector 在 c++ 中声明 3D 数组结构
- 为什么C CHAR数据类型3D数组通过参数第一个括号为空白
- 可以使用 std::copy 将 3D 数组复制到矢量
- 我的重载 [] 运算符不适用于伪 3D 数组
- 从 3D 数组转换为 1D 数组失败
- 如何将3D .OBJ对象表示为3D数组
- 如何在C++中定义每个维度具有不同类型的 3D 数组
- CPP 3D 动态创建由单个内存块组成的 3D 数组
- 视觉读取列文本数据并在C++中放入 3D 数组
- 将 3D 数组的索引传递给函数