Tag: mpi

MPI_Scatter – 发送2D数组的列

我想发送2D数组的列,每个列都是单独的进程。 我现在有一个完整的2darrays,我被MPI_Scatter困住了。 如何将整列作为字段发送? 谢谢 编辑: 我有arrays – 浮动[100] [101] 我试图通过以下方式发送数组: float send; MPI_Scatter ((void *)a, n, MPI_FLOAT,(void *)&send , 1, MPI_INT,0, MPI_COMM_WORLD); EDIT2: 我创建了新的type_vector: MPI_Datatype newtype; MPI_Type_vector(n, /* # column elements */ 1, /* 1 column only */ n+1, /* skip n+1 elements */ MPI_FLOAT, /* elements are float */ &newtype); /* MPI derived datatype […]

MPI – 按订单打印

我正在尝试在C中编写一个函数,每个处理器都会打印自己的数据。 这是我有的: void print_mesh(int p,int myid,int** U0,int X,int Y){ int i,m,n; for(i=0;i<p;i++){ if(myid==i){ printf("myid=%d\n",myid); for(n=0;n<X;n++){ for(m=0;m<Y;m++){ printf("%d ",U0[n][m]); } printf("\n"); } } else MPI_Barrier(MPI_COMM_WORLD); } } 它由于某种原因不起作用。 arrays全部混合打印。 你有什么见解,为什么这不起作用? 还有其他有用的想法吗? 如果可能,我不想在主进程中发送整个数组。 另外,我不想使用预编译function。

MPI以最小值获得处理器

在MPI中,我正在对值进行reduce操作(最小值)。 这样可以正常工作,但是如何获取最小值的处理器编号并请求该处理器获取更多信息(或使用reduce操作发送附加数据)?

为包含指针的结构创建MPI_Datatype

我有以下结构。 typedef struct { int *Ai; double *Ax; int nz; }column; 我想使用MPI_Send和MPI_Receive传输此结构。 如何为此结构创建MPI_Datatype ?

无法理解MPI_Type_create_struct

我无法理解MPI_Type_create_struct方法。 假设我们有一个结构: struct foo(){ float value; char rank; } 我们希望将此结构发送到另一个进程。 考虑下面的代码示例: int count = 2; //number of elements in struct MPI_Aint offsets[count] = {0, 8}; int blocklengths[count] = {1, 1}; MPI_Datatype types[count] = {MPI_FLOAT, MPI_CHAR}; MPI_Datatype my_mpi_type; MPI_Type_create_struct(count, blocklengths, offsets, types, &my_mpi_type); 我不确定在这个例子中做什么偏移和块长度。 有人可以解释上面这两部分吗?

使用MPI分散不同大小的矩阵块

(假设所有矩阵都按行主顺序存储。)说明问题的一个例子是在3×3网格上分布10×10矩阵,以便每个节点中子矩阵的大小看起来像 |—–+—–+—–| | 3×3 | 3×3 | 3×4 | |—–+—–+—–| | 3×3 | 3×3 | 3×4 | |—–+—–+—–| | 4×3 | 4×3 | 4×4 | |—–+—–+—–| 我在Stackoverflow上看过很多post(例如使用MPI和MPI分区矩阵将 C块中的2D数组块发送 到块中 )。 但是它们只处理相同大小的块(在这种情况下,我们可以简单地使用MPI_Type_vector或MPI_Type_create_subarray并且只使用一个MPI_Scatterv调用)。 所以,我想知道在MPI中将矩阵分散到处理器网格中的最有效方法是什么,其中每个处理器都有一个具有指定大小的块。 PS我也看过MPI_Type_create_darray ,但似乎没有让你为每个处理器指定块大小。

MPI_Type_create_subarray和MPI_Gather

我必须解决一个小的mpi问题。 我有4个从属进程,每个进程都希望向master 0发送一个2d子arrays(CHUNK_ROWS X CHUNK_COLUMNS).Master 0收集ddd [ROWS] [COLUMNS]中的所有块并打印出来。 我想用MPI_Gather() #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; matrice = (int **)malloc(righe * sizeof(int*)); if(matrice != NULL){ matrice[0] = (int *)malloc(righe*colonne*sizeof(int)); if(matrice[0]!=NULL) for(i=1; i<righe; […]

使用MPI_Scatter发送矩阵的列

我正在尝试使用MPI编写矩阵向量乘法程序。 我正在尝试将矩阵的列发送到单独的进程并在本地计算结果。 最后,我使用MPI_SUM操作执行MPI_SUM 。 发送矩阵的行很容易,因为C按行主顺序存储数组,但列不是(如果不逐个发送)。 我在这里读到了这个问题: MPI_Scatter – 发送2D数组的列 Jonathan Dursi建议使用新的MPI数据类型,这就是我根据自己的需要调整代码所做的工作: double matrix[10][10]; double mytype[10][10]; int part_size; // stores how many cols a process needs to work on MPI_Datatype col, coltype; // … MPI_Type_vector(N, 1, N, MPI_DOUBLE, &col); MPI_Type_commit(&col); MPI_Type_create_resized(col, 0, 1*sizeof(double), &coltype); MPI_Type_commit(&coltype); // … MPI_Scatter(matrix, part_size, coltype, mypart, part_size, coltype, 0, MPI_COMM_WORLD); // […]

MPI_Bcast一个动态的2Darrays

我试图将带有bcast的动态二维数组传递给所有级别。 我有以下代码。 #include #include int main(int argc, char **argv) { float **array; int rank,size,i,j; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) { array = (float **)malloc(10*sizeof(float)); for(i=0;i<10;i++) array[i] = (float *)malloc(10*sizeof(float)); for(i=0;i<10;i++) for(j=0;j<10;j++) array[i][j]=i+j; } MPI_Bcast(array,10*10,MPI_FLOAT,0,MPI_COMM_WORLD); MPI_Finalize(); } 由于某种原因,我无法理解我得到分段错误。 谁知道问题是什么?

MPI分区矩阵成块

我想将矩阵分区为块(而不是条带),然后使用MPI_Scatter分配这些块。 我提出了有效的解决方案,但我认为它远非“最佳实践”。 我有8×8矩阵,填充0到63之间的数字。然后我将它分成4个4×4块,使用MPI_Type_vector并通过MPI_Send分配它,但这需要一些额外的计算,因为我必须计算大矩阵中每个块的偏移量。 如果我使用分散,则第一个(左上角)块被传输OK,但是其他块不是(块的开始是错误的偏移)。 那么可以使用MPI_Scatter传输矩阵块,或者进行所需分解的最佳方法是什么? 这是我的代码: #include #include #include #define SIZE 8 int main(void) { MPI_Init(NULL, NULL); int p, rank; MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &rank); char i; char a[SIZE*SIZE]; char b[(SIZE/2)*(SIZE/2)]; MPI_Datatype columntype; MPI_Datatype columntype2; MPI_Type_vector(4, 4, SIZE, MPI_CHAR, &columntype2); MPI_Type_create_resized( columntype2, 0, sizeof(MPI_CHAR), &columntype ); MPI_Type_commit(&columntype); if(rank == 0) { for( i = 0; i […]