mpi_gather,c中的2d动态数组,退出信号6(中止)
发布时间:2020-12-16 07:12:55 所属栏目:百科 来源:网络整理
导读:经过搜索和搜索,我有了为向量或线性等nD数组分配内存的功能. 功能是: int malloc2dint(int ***array,int n,int m) { /* allocate the n*m contiguous items */ int *p = (int *)malloc(n*m*sizeof(int)); if (!p) return -1; /* allocate the row pointers
经过搜索和搜索,我有了为向量或线性等nD数组分配内存的功能.
功能是: int malloc2dint(int ***array,int n,int m) { /* allocate the n*m contiguous items */ int *p = (int *)malloc(n*m*sizeof(int)); if (!p) return -1; /* allocate the row pointers into the memory */ (*array) = (int **)malloc(n*sizeof(int*)); if (!(*array)) { free(p); return -1; } /* set up the pointers into the contiguous memory */ int i; for (i=0; i<n; i++) (*array)[i] = &(p[i*m]); return 0; } 通过使用这种方法,我可以正确地广播和分散2d动态分配数组,但MPI_Gather中的问题仍然存在. int length = atoi(argv[1]); int rank,size,from,to,i,j,k,**first_array,**second_array,**result_array; MPI_Init (&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); //2D dynamic memory allocation malloc2dint(&first_array,length,length); malloc2dint(&second_array,length); malloc2dint(&result_array,length); //Related boundary to each task from = rank * length/size; to = (rank+1) * length/size; //Intializing first and second array if (rank==0) { for(i=0; i<length; i++) for(j=0; j<length; j++) { first_array[i][j] = 1; second_array[i][j] = 1; } } //Broadcast second array so all tasks will have it MPI_Bcast (&(second_array[0][0]),length*length,MPI_INT,MPI_COMM_WORLD); //Scatter first array so each task has matrix values between its boundary MPI_Scatter (&(first_array[0][0]),length*(length/size),first_array[from],MPI_COMM_WORLD); //Now each task will calculate matrix multiplication for its part for (i=from; i<to; i++) for (j=0; j<length; j++) { result_array[i][j]=0; for (k=0; k<length; k++) result_array[i][j] += first_array[i][k]*second_array[k][j]; //printf("nrank(%d)->result_array[%d][%d] = %dn",rank,result_array[i][j]); //this line print the correct value } //Gathering info from all task and put each partition to resulat_array MPI_Gather (&(result_array[from]),result_array,MPI_COMM_WORLD); if (rank==0) { for (i=0; i<length; i++) { printf("nt| "); for (j=0; j<length; j++) printf("%2d ",result_array[i][j]); printf("|n"); } } MPI_Finalize(); return 0; 现在当我运行mpirun -np 2 xxx.out 4时输出为: | 4 4 4 4 | ---> Good Job! | 4 4 4 4 | ---> Good Job! | 1919252078 1852795251 1868524912 778400882 | ---> Where are you baby?!!! | 540700531 1701080693 1701734758 2037588068 | ---> Where are you baby?!!! 最后,mpirun注意到进程等级0退出信号6(中止). 解决方法
问题在于如何传递缓冲区.您正在MPI_Scatter中正确执行此操作,但对MPI_Gather执行错误.
将result_array作为via& result_array [from]传递将读取保存指针列表的内存而不是矩阵的实际数据.请改用& result_array [from] [0]. 类似地,对于接收缓冲区.传递& result_array [0] [0]而不是result_array将指针传递到数据位于内存中的位置. 因此,而不是: //Gathering info from all task and put each partition to resulat_array MPI_Gather (&(result_array[from]),MPI_COMM_WORLD); 做: //Gathering info from all task and put each partition to resulat_array MPI_Gather (&(result_array[from][0]),&(result_array[0][0]),MPI_COMM_WORLD); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |