Tag: scatter

C MPIarrays搜索(MPI_Scatter分段故障)

我的MPI代码一直在运行所有非主任务的分段错误。 #include “mpi.h” #include #include int main(int argc, char* argv[]) { int list_size = 1000 int threads; int th_nums; int slice; int index; char* the_array[list_size]; char* temp_array[list_size]; char str_to_search[10]; FILE *in = fopen(“inputfile”, “r”); char parse[10]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &threads); MPI_Comm_size(MPI_COMM_WORLD, &th_nums); if (threads == 0) { // if master task fgets(parse, 10, in); slice […]

使用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分配这些块。 我提出了有效的解决方案,但我认为它远非“最佳实践”。 我有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 […]