Tag: mpi

MPI_Bcast在if语句中?

我正在尝试MPI,当我在命令行上通过mpirun运行它时,我一直收到此错误。 ———————————————————————————————- mpirun noticed that the job aborted, but has no info as to the process that caused that situation. ———————————————————————————————- 我不确定为什么,因为其他mpi程序运行完全正常。 这是我的代码。 #include #include int func(int num){ int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (num == 0){ num = 5; MPI_Bcast(&num, 1, MPI_INT, rank, MPI_COMM_WORLD); } return num; } int main(int argc, char **argv){ int rank, […]

最适合“块分解”的MPI_Datatype?

在Jonathan Dursi和osgx的帮助下 ,我现在已经完成了进程中的“行分解”: 行http://img535.imageshack.us/img535/9118/ghostcells.jpg 现在,我想尝试“块分解”方法(如下图所示): 阻止http://img836.imageshack.us/img836/9682/ghostcellsblock.jpg 应该怎么做呢? 这次, MPI_Datatype是必要的,对吧? 哪种数据类型最合适/易于使用? 或者它可以在没有数据类型的情况下完成吗?

MPI_Gather 2D数组

N是4, N_glob 。 它恰好是相同的大小。 p是4。 这是代码的一小部分: float **global_grid; float **gridPtr; lengthSubN = N/pSqrt; subN = lengthSubN + 2; grid = allocate2D(grid, subN, subN); .. MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType); MPI_Type_commit(&rowType); .. gridPtr = grid; .. MPI_Barrier(MPI_COMM_WORLD); if(id == 0) { global_grid = allocate2D(global_grid, N_glob, N_glob); } MPI_Barrier(MPI_COMM_WORLD); MPI_Gather(&(gridPtr[0][0]), 1, rowType, &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if(id […]

MPI_Type_create_subarray和MPI_Send

这是我在stackoverflow中的第一个问题。 我有两个进程,一个root 0和一个slave 1. Slave分配一个2d数组(CHUNK_ROWS + 2,CHUNK_COLUMNS + 2)并想发送一个[CHUNK_ROWS] [CHUNK_COLUMNS]子数组。 Root分配一个2d数组(ROWS,COLUMNS)并接收想要从ddd [0] [0]存储的子数组并打印它。 结果我弄错了..为什么? 我知道这是一个无意义的代码,但它只是一个简单的程序,可以帮助我在更复杂的项目中。 这里的代码: #include #include using namespace std; #define ROWS 10 #define COLUMNS 10 #define CHUNK_ROWS 5 #define CHUNK_COLUMNS 5 #define TAG 0 int** alloca_matrice(int righe, int colonne) { int** matrice=NULL; int i; // per allocare la matrice devo fare in questo […]

使用MPI_Scatterv分散数组的重叠区域

我有一个二维数组的一维数组表示:下面是一个6×6的例子: [00000012300456700890100234500000] => [——] [|0123|] [|4567|] [|8901|] [|2345|] [——] 典型尺寸为514 * 514个元素(512 + 2个晕圈单元)。 我必须在四个处理器之间分配数据: Rank 0: Rank 1: Rank 2: Rank 3: [—-] [—-] [|456] [567|] [|012] [123|] [|890] [901|] [|456] [567|] [|234] [345|] [|890] [901|] [—-] [—-] 也就是说,进入排名0的数据的最右边部分也必须到达排名为1的数据的左边部分,依此类推,与所有其他邻居对。 我知道如何制作大小为4×4的数据类型,但不知道如何重新发送该数组的最后一个元素作为新数组的开头到另一个等级。 如何分发具有重叠的数据? ===编辑=== 使用它之后Jonathon …… 我正在尝试使用char数组(2D)执行此操作,但是当从处理器/队列中收集它们时,我会收到“垃圾”。 我改变了类型和一切,但无法弄清楚问题出在哪里。 void distributeBySend_c(unsigned char **global, const int globalrows, const […]

以mpi分散

这是mpi scatter的代码: #include #include int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[1]; int main(int argc, char *argv[]) { int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Barrier(MPI_COMM_WORLD); if(rank ==0){ MPI_Scatter(a,1,MPI_INT,b,1,MPI_INT,0,MPI_COMM_WORLD); } MPI_Barrier(MPI_COMM_WORLD); printf(“\n%d from rank=%d\n”,b[0],rank); MPI_Finalize(); return 0; } 我想要输出如下: 1等级0 2级来自1级 排名2的3 … 但我得到了 1等级0 排名第1的0 等级2的0 等级3的0 排名第4的0 …

在MPI进程之间传递可变长度的结构

我需要MPI_Gatherv()一些int / string对。 让我们说每一对看起来像这样: struct Pair { int x; unsigned s_len; char s[1]; // variable-length string of s_len chars }; 如何为Pair定义合适的MPI数据类型?

如何使用MPI_Scatterv将矩阵行发送到所有进程?

我正在使用MPI接口。 我想分割矩阵(按行)并在每个过程中分配部分。 例如,我有这个7×7方阵M. M = [ 0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 19.00 20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00 30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00 40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 […]

串行调用mpi二进制文件作为mpi应用程序的子进程

我有一个大型并行(使用MPI)模拟应用程序,它可以生成大量数据。 为了评估这些数据,我使用了一个python脚本。 我现在需要做的是运行此应用程序很多次(> 1000)并从结果数据计算统计属性。 到目前为止,我的方法是让一个python脚本并行运行(使用mpi4py,使用ie节点),使用subprocess.check_call调用模拟代码。 我需要这个调用来串行运行我的mpi模拟应用程序。 在这种情况下,我不需要模拟并行运行。 然后python脚本可以并行分析数据,并在完成后启动新的模拟运行,直到累积大量运行。 目标是 不保存2000次运行的整个数据集 将中间数据保存在内存中 Stub MWE: file multi_call_master.py : from mpi4py import MPI import subprocess print “Master hello” call_string = ‘python multi_call_slave.py’ comm = MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() print “rank %d of size %d in master calling: %s” % (rank, size, call_string) std_outfile = “./sm_test.out” […]

如何从处理器MPI_Gatherv列,其中每个进程可以发送不同数量的列

假设2个进程正在参与。 过程0(等级0)具有 A = { ad be cf } 和过程1(等级1)有 A = { g h i } 我希望两个处理器将这些列发送到0级,以便排名0将具有下面的另一个2Darrays。 B = { adg beh cfi } 我为MPI_Gatherv创建了一个新的列数据类型,我正在尝试以下代码,这让我无处可去。 我的具体问题是: 我应该如何处理这个问题 什么应该是send_type和recv_type。 如何指定位移(如果它们是新数据类型或MPI_CHAR) 谢谢。 这是我的代码: #include #include int main(int argc, char *argv[]) { int numprocs, my_rank; long int i, j; MPI_Status status; char **A; char **B; MPI_Init(&argc, &argv); […]