- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 MPI 库的 C 程序。我初始化了一个动态二维数组,其维度(行和列)是从进程根的 stdin
读取的。
当我尝试在其他进程之间循环分配元素(列)时,我没有取得任何进展。我使用 MPI_Scatter 将列分配给数组中的其他进程。在那里,我利用了二维数组的派生数据类型 MPI_Type_vector
。
当然,它只将第一列分配给进程的本地一维数组。因此,对于其余部分,我将 MPI_Scatter 放入 for 循环中,现在我已分配所有列,但仅限于进程数和矩阵维度相等的情况。 如何使用 MPI_Scatter
将多个列分配给一个进程?
到目前为止,我怀疑这是否是解决问题的最佳尝试,因为一定有更好的方法,更少的沟通。
使用一维数组代替二维数组作为矩阵是否更明智?
编辑:
经过一番思考,很明显,如果我使用 for 循环,派生数据类型 MPI_Type_vector
就变得不必要了。这表明 for 循环没有给我带来任何进一步的帮助。
for(i=0 ;i<m; i++)
MPI_Scatter(&(array[i][0]), 1, ub_mpi_t, &local_array[i], 1, MPI_DOUBLE, 0,
MPI_COMM_WORLD) ;
最佳答案
好吧,让我们先尝试一下简单的情况——每个进程只有一列。以下是我对上面内容稍作编辑的版本;我想指出的差异只是我们改变了数组 A 的分配方式,并且我们只使用一种 vector 数据类型:
#include <mpi.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
double **A = NULL ; /*2D array initialised on process 0 */
double *Adata = NULL;
double *sendbufptr = NULL;
int i,j ;
double *column ; /*1D array for column */
const int columnlen=6;
int my_rank, p ;
MPI_Datatype vector_mpi_t ;
MPI_Init(&argc,&argv) ;
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank) ;
MPI_Comm_size(MPI_COMM_WORLD,&p) ;
/*initialise 2D array on process 0 and allocate memory*/
if(my_rank==0)
{
A = (double**)malloc(p*sizeof(double *)) ;
Adata = (double *)malloc(p*columnlen*sizeof(double));
for(i=0;i<p;i++)
A[i] = &(Adata[i*columnlen]);
for (i=0; i<p; i++)
for (j=0; j<columnlen; j++)
A[i][j] = i;
/* print 2D array to screen */
printf("Rank 0's 2D array:\n");
for(i=0;i<p;i++)
{
for(j=0;j<columnlen;j++)
printf( "%lf " , A[i][j]) ;
printf( "\n") ;
}
printf( "\n") ;
printf( "\n") ;
}
/* initialise and allocate memory for 1d column array on every process */
column = (double*)malloc(columnlen*sizeof(double)) ;
for(i=0;i<columnlen;i++)
{
column[i] = 0 ;
}
/*derived datatype for 2D array columns*/
MPI_Type_vector(columnlen,1,1,MPI_DOUBLE,&vector_mpi_t) ;
MPI_Type_commit(&vector_mpi_t);
sendbufptr = NULL;
if (my_rank == 0) sendbufptr=&(A[0][0]);
MPI_Scatter(sendbufptr, 1, vector_mpi_t, column, 1, vector_mpi_t, 0, MPI_COMM_WORLD);
/*print column on every process */
printf("Rank %d's column: \n", my_rank);
for(i=0;i<columnlen;i++)
{
printf( "%lf " , column[i]) ;
}
printf( "\n") ;
MPI_Finalize() ;
free(column);
free(Adata);
free(A);
return 0;
}
这里的关键是 MPI_Scatter 接受一个指向数据 block 的指针,而不是指向指针的指针。因此,它不会取消引用 A[1],然后发送指向那里的内容,然后发送 A[2] 和指向那里的内容,等等。它需要一个连续的数据 block 。因此,我们已经安排了 A 的数据在内存中的布局方式(请注意,这通常是数值计算的正确方法)——它有一列数据,后面跟着下一列数据,等等(虽然我打印数据的方式更像是行,但无论如何。)
还要注意,在 MPI_Scatter 调用中,我不能只使用 &(A[0][0]),因为这会在除一个进程之外的所有进程中取消引用空指针。
从一栏到几栏非常简单;列数据结构从一维数组变成了像 A 一样布局的二维数组。
#include <mpi.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
double **A = NULL ; /*2D array initialised on process 0 */
double *Adata = NULL;
double *sendbufptr = NULL;
int i,j ;
double **columns ; /*2D array for column */
double *columndata;
const int columnlen=6;
int ncolumns;
int my_rank, p ;
MPI_Datatype vector_mpi_t ;
MPI_Init(&argc,&argv) ;
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank) ;
MPI_Comm_size(MPI_COMM_WORLD,&p) ;
ncolumns = 2*p;
/*initialise 2D array on process 0 and allocate memory*/
if(my_rank==0)
{
A = (double**)malloc(ncolumns*sizeof(double *)) ;
Adata = (double *)malloc(ncolumns*columnlen*sizeof(double));
for(i=0;i<ncolumns;i++)
A[i] = &(Adata[i*columnlen]);
for (i=0; i<ncolumns; i++)
for (j=0; j<columnlen; j++)
A[i][j] = i;
/* print 2D array to screen */
printf("Rank 0's 2D array:\n");
for(i=0;i<ncolumns;i++)
{
for(j=0;j<columnlen;j++)
printf( "%lf " , A[i][j]) ;
printf( "\n") ;
}
printf( "\n") ;
printf( "\n") ;
}
/* initialise and allocate memory for 1d column array on every process */
columndata = (double*)malloc((ncolumns/p)*columnlen*sizeof(double)) ;
columns = (double **)malloc((ncolumns/p)*sizeof(double *));
for(i=0;i<(ncolumns/p);i++)
{
columns[i] = &(columndata[i*columnlen]);
}
/*derived datatype for 2D array columns*/
MPI_Type_vector(columnlen,1,1,MPI_DOUBLE,&vector_mpi_t) ;
MPI_Type_commit(&vector_mpi_t);
sendbufptr = NULL;
if (my_rank == 0) sendbufptr=&(A[0][0]);
MPI_Scatter(sendbufptr, (ncolumns/p), vector_mpi_t, &(columns[0][0]), (ncolumns/p), vector_mpi_t, 0, MPI_COMM_WORLD);
/*print columns on every process */
printf("Rank %d's columns: \n", my_rank);
for(i=0;i<ncolumns/p;i++)
{
printf( "[%d]: ", my_rank) ;
for(j=0;j<columnlen;j++)
{
printf( "%lf " , columns[i][j]) ;
}
printf( "\n") ;
}
MPI_Finalize() ;
free(columns);
free(Adata);
free(A);
return 0;
}
然后,每个处理器的不同列数需要使用 MPI_Scatterv 而不是 MPI_Scatter。
关于c - 二维数组从根到其他进程的 MPI 列循环分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3751141/
我有两个项目。一个项目正在运行,没有任何问题。它是从 gitlab 下载的。另一个项目是从 github 下载的。 github项目有这个问题。我想使用默认的 gradle 分布。我想知道我做错了什么
我正在通过我学习的大学提供的 VNC 软件(远程访问)使用 IBM bigInsights,但我无法通过该桌面访问 Internet。为了使用互联网上的一些数据样本,我决定安装 Hadoop 在我的笔
所以,这非常简单,我有一个包含嵌套列表的列表,如下所示: List( *list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")
我有以下示例。 prefix = ['blue ','brown '] suffix = [('dog','shoes','bike'), ('tree','cat','car')] 我想获得一个如下
我创建了一项调查并将其发送出去。该调查要求用户提供电子邮件,然后要求他们从包含 8 个不同选项的下拉菜单中选择要吃哪顿饭。有些人使用同一封电子邮件多次填写调查,但食物选择不同。 我有一个如下所示的 M
我在 Python 中使用 plotly 来创建由某些分类变量着色的美国县的等值线。由于县非常小,因此图像中的边界线占主导地位。我怎样才能摆脱它们(或将它们的宽度设置为零)? 到目前为止的代码和输出(
我们有qgamma在 R 和 gamm.inv在 excel 中,我无法使用 invgamma 获得相同的结果python中的函数。例如在excel中GAMMA.INV(0.99,35,0.08)=4
过去几年我经常使用 Docker,但对于 Kubernetes 来说我还是个新手。我从今天开始,与我以前使用 Docker swarm 的方式相比,我正在努力思考 Pod 概念的实用性。 假设我有一个
我有一个 UIStackView然而,subViews的第一个 View 是 UILabel它没有相应地调整它的大小。 我的代码如下; private let stackView: UIStackVi
我想绘制自由度为 1、2、5 和 10 的 Student t 分布;所有在一个图中,并为图中的每个分布使用不同的颜色。此外,在 Canvas 的左上角创建一个图例,并增加 df = 1 的曲线线宽。
我对 Python 很陌生,我在互联网上浏览过,但找不到任何可以帮助我解决问题的逻辑。 我在图中有降水值,现在我需要根据图中的这些值拟合 GEV 分布。每个值等于从 1974 年到 2017 年的一年
我正在尝试复制此图 https://wind-data.ch/tools/weibull.php 我编写的代码是 import matplotlib.pyplot as plt import nump
对于家庭作业,我必须绘制文本的词频并将其与最佳 zipf 分布进行比较。 根据对数对数图中的排名绘制文本的词频计数似乎效果很好。 但是我在计算最佳 zipf 分布时遇到了麻烦。结果应该如下所示: 我不
Mathematica 具有四参数广义逆 Gamma 分布: http://reference.wolfram.com/mathematica/ref/InverseGammaDistribution
正在用 C 语言开发一个学校项目,使用 Pthreads 将一维数组分解为 tRows 和 tCols 的子矩阵。整个数组的大小为 wRows 和 wCols。假设 wCols = 4、wRows =
有没有办法得到制服int32_t没有警告的分发?我用这个uniform_int_distribution在我的代码中,但我收到警告: 54988961.cpp: In function ‘int ma
在花了相当多的时间试图了解如何在 postgresql 数据库服务器之间实现负载平衡(分配数据库处理负载)之后,我来到这里。 我有一个 postgresql 系统,每秒吸引大约 100 笔交易,而且这
所以标题已经说明了一切。我们正在开发一个开始获得大量依赖项的项目。到目前为止,我们一直在使用 setuptools,但越来越多的依赖项要么不容易安装(例如 wxPython),要么在某些使用 easy
我有以下代码: #include #include #include using namespace boost::numeric; using namespace interval_lib;
我有一个对象列表,我想以随机顺序连续访问这些对象。 我想知道是否有一种方法可以确保随机值并不总是相似。 例子。 我的列表是队列列表,我试图交错这些值以生成用于测试的真实场景。 我并不是特别想要队列 1
我是一名优秀的程序员,十分优秀!