Tag: mpi

为什么mpirun不尊重我选择的BTL?

我在Windows 7机器上使用Cygwin上的Open MPI(1.8.3)。 我想在这台机器上独占运行MPI代码,而无需在任何外部网络上进行通信。 我知道我应该能够使用MCA选项将mpirun限制为自我和共享内存通信,如下所示: mpirun -n 8 –mca btl sm,self ./hello.exe 但是,当我尝试这个时,Windows会问我是否要设置防火墙例外,这表明我的工作是尝试通过TCP进行外部通信。 此外,mpirun将在完成前大约一分钟挂起,并且只有在hello world job完成之前我在无线网络上。 如果我关闭无线网卡或切换到有线以太网连接,它会在预期的大约一秒钟内完成。 为什么mpirun没有观察我选择的BTL?

从OpenMP到MPI

我只是想知道如何将以下openMP程序转换为MPI程序 #include #define CHUNKSIZE 100 #define N 1000 int main (int argc, char *argv[]) { int i, chunk; float a[N], b[N], c[N]; /* Some initializations */ for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE; #pragma omp parallel shared(a,b,c,chunk) private(i) { #pragma omp for schedule(dynamic,chunk) nowait for (i=0; […]

MPI发送和接收不能超过8182倍

我遇到以下代码的麻烦: int main(int argc, char *argv[]){ int id, p, n, ln, i, j, retCode; double *buffer; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &id); n = strtol(argv[1],NULL,10); // total number of elements to be distributed ln = n/p; // local number of elements buffer = (double*)calloc(ln, sizeof(double)); if (id == p-1) // Process p-1 send to other […]

使用MPI Derived数据类型创建并传递“结构数组”

我正在尝试使用MPI衍生数据类型使用MPI_Type_create_struct编写MPI_Alltoallv。 我找不到任何解决这个问题的例子。 像这样的大多数例子使用单个struct成员执行通信(Send / Recv),而我的目标是结构数组。 以下是一个更简单的测试代码,它尝试对使用DDT创建的结构数组执行MPI_Sendrecv操作: #include #include #include #include typedef struct sample{ char str[12]; int count; }my_struct; int main(int argc, char **argv) { int rank, count; my_struct *sbuf = (my_struct *) calloc (sizeof(my_struct),5); my_struct *rbuf = (my_struct *) calloc (sizeof(my_struct),5); int blens[2]; MPI_Aint displs[2]; MPI_Aint baseaddr, addr1, addr2; MPI_Datatype types[2]; MPI_Datatype contigs[5]; MPI_Status status; […]

在MPI_Gather C中寻址内存

我正在尝试将数据传递给MPI_Gather 。 我按如下方式分配内存: float *phie, *phitemp; MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); phitemp=(float *) malloc(20*sizeof(float)); if (rank==1) phie=(float *) malloc(itermax*20*size*sizeof(float)); 然后让所有进程使用MPI_Gather()将数据发送到排名1,如下所示: for (iter=0;iter<itermax;iter++) { MPI_Gather((float *) phitemp, 20, MPI_FLOAT, (float *) (phie+iter*20*size*sizeof(float)), 20, MPI_FLOAT, 1, MPI_COMM_WORLD); iter=0; } 我收到错误消息表明我没有正确分配内存。

雅各比在MPI放松

我在1小时前创建了一个问题,但问得不好,所以我重新创建了一个问题。 我在C中得到了Jacobi放松的代码: while ( error > tol && iter < iter_max ) { error = 0.0; for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { Anew[j][i] = 0.25 * ( A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]); error = fmax( error, fabs(Anew[j][i] – […]

MPI派生的数据类型适用于浮点数,但不适用于双精度数。 这是对齐问题吗?

我有一个与C结构相关的奇怪问题,它是在MPI派生数据类型的帮助下进行通信的。 以下示例有效; 它只是发送一个由一个integer加上4个float值组成的消息。 Minmum工作示例: #include #include int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); int i, rank, tag = 1; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Array of doubles plus element count typedef struct { int row; float elements[4]; } My_array; // Derived datatype for an array of doubles plus element count MPI_Datatype MY_ARRAY_TYPE; const int […]

MPI在c。 我收不到发送的东西

我是MPI的新手。 我正在尝试编写一些简单的代码。 这里是: #include #include #include #include #include #include #define ONE 0 #define TWO 1 int main(int argc, char * argv[]) { int dimension = 5; float ** matrix; float * mat1; float * mat2; int i,j,numNeighbor, processReceived,rank,size,retval; int k = 0; retval = MPI_Init(&argc, &argv); MPI_Request sendRequest[2], recvRequest[2]; MPI_Status status[2]; MPI_Datatype row; MPI_Type_vector(dimension, 1, […]

MPI Cartesian拓扑:MPI_Neighbor_alltoall收到错误的数据

我有一个MPI笛卡尔拓扑,并希望通过MPI_Neighbor_alltoall将每个节点等级发送给它们的邻居。 我无法弄清楚,错误在哪里,我也实现了我自己的MPI_Neighbor_alltoall,这是行不通的。 我将我的代码最小化为(希望)易于理解的代码片段。 alltoall.c #include #include #include #include int main(int argc, char** argv) { // MPI_Cart variables MPI_Comm cart_comm; MPI_Comm mycomm; int ndims=2; int periods[2]={0,0}; int coord[2]; int dims[2]={3,3}; int xdim = dims[0]; int ydim = dims[1]; int comm_size = xdim*ydim; // Initialize the MPI environment and pass the arguments to all the processes. MPI_Init(&argc, […]

MPI中的进程数量是否有限制?

我正在阅读“使用MPI”并尝试自己执行代码。 第6.3章中有一个网格分解代码。 它编译时没有任何警告或错误,并且使用少量进程运行,但在我的笔记本电脑上失败,但数量更大,比如30。 我的笔记本电脑是4核,超线程和8G内存。 la_grid_2d_new两个版本都不起作用,但第一个版本可以容忍更大的数字,比如35,但是40个进程失败了。 我不知道为什么。 请问你能帮帮我吗? 非常感谢。 #include #include #include typedef struct { int P, Q; int p, q; MPI_Comm grid_comm; MPI_Comm row_comm; MPI_Comm col_comm; } LA_Grid_2d; LA_Grid_2d *la_grid_2d_new(MPI_Comm comm, int P, int Q) { LA_Grid_2d *grid; MPI_Comm row, col; int my_rank, p, q; MPI_Comm_rank(comm, &my_rank); p=my_rank/Q; q=my_rank%Q; MPI_Comm_split(comm, p, q, &row); MPI_Comm_split(comm, q, […]