- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个静态分配的 2D 数组 NxN,我想发送 i
第 列(带有 i = 0 ... N-1
)。
我写:
int main(int argc, char **argv) {
int myrank, nprocs;
int i,j;
int matrix[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int col[N];
...
// Define type "column"
MPI_Datatype column;
MPI_Type_vector(N,1,N,MPI_INT,&column);
MPI_Type_commit(&column);
if(myrank==0){
j=0;
MPI_Send(&matrix[0][j],1,column,1,99,MPI_COMM_WORLD);
}
if(myrank==1){
// **** FIRST MODE: Don't use "column" type *****
MPI_Recv(col,N,MPI_INT,0,99,MPI_COMM_WORLD,&info);
// **** SECOND MODE: Use "column" type *****
// MPI_Recv(col,1,column_INT,0,99,MPI_COMM_WORLD,&info);
printf("\nColumn: ");
for(j=0;j<N;j++)
printf("\n %d",col[j]);
}
MPI_Type_free(&column);
MPI_Finalize();
return 0;
}
为什么第一种模式能够正确返回:
1 5 9 13
第二个返回错误?
1 -2 1980804601 1980804675
最佳答案
MPI 数据类型描述了数据的布局以及数据的数量。例如,列类型的计数 1 描述了 N 个整数,但 N MPI_INT
的计数也是如此。不同之处在于,您的列类型(正确地)描述了在大小为 NxN 的数组中跳转以提取列。使用该类型发送会提取 N 个整数,并将它们捆绑到一条消息中。
因此,当您发送时,您发送其中一种列类型来发送特定的 N 个整数,这些整数在数组中形成一列。但是当需要接收时,虽然您仍然希望接收 N 个整数,但是您将其接收到一个连续的一维整数数组(您的 col[]
数组)中,所以您只想接收 N MPI_INT
。如果你接收到一个列数据类型,你仍然会收到 N 个整数,但它们将被放入内存中,间隔 N 个整数(事实上,如果 N 足够大,你会得到一个段错误,因为你在外面写得很好col 数组的边界)。这就是为什么当您收到列类型时,只有第一个数字是正确的;其余的都是垃圾,因为数组的其余部分仍未初始化。您的第二条数据 5
将被写入到 col 数组的末尾。
关于c - 在 C 中使用 MPI_Type_vector 接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521129/
我有一个大小为 8x8 的矩阵。我想使用 MPI_Type_vector 将偶数行(编号为 0、2、4、8 的行)发送到另一个进程。我想出了这段代码: #include #define INITIA
当我尝试使用 收集 double 类型的数组时,我收到错误消息“MPI_Gather 中发生错误”超过 750 元素放入表示矩阵的数组中。正在收集的数组应该代表矩阵的列,并且由于矩阵的构造使得行在内存
我有一个静态分配的 2D 数组 NxN,我想发送 i第 列(带有 i = 0 ... N-1 )。 我写: int main(int argc, char **argv) { int myra
我正在尝试与 MPI 并行乘以方阵。 我使用 MPI_Type_vector 将方形子矩阵( float 组)发送到进程,以便它们可以计算子乘积。然后,对于下一次迭代,这些子矩阵将作为 MPI_Typ
我有以下代码,我用它来测试我如何在另一个程序中使用 MPI_Type_vector。我编写了这个小测试程序,以便我可以检查我提供给 MPI_Type_vector 的参数,以确保它们提取了数组的正确部
我是一名优秀的程序员,十分优秀!