나는 각 프로세스가 자신의 서브 매트릭스를 가지고있는 3D 매트릭스에서 작동하는 병렬 코드를 작성하려고하지만, 자신의 작업을 수행하기 위해 이웃 프로세스의 서브 매트릭스 (경계 평면)에 대한 정보가 필요하다. 이러한 정보를 지점 간 통신으로 보내지 만 대형 매트릭스의 경우 좋은 생각이 아니므로 파생 데이터 유형을 통신에 사용하기로 결정했습니다. 나는 mpi_type_vector
에 문제가 예를 들어 나는 NX*NY*NZ
매트릭스를 가지고 있고 나는이 일을 다음과 같은 행 쓰기 다른 프로세스에 일정 NY
와 비행기를 보낼 :3D 배열에 MPI 파생 데이터 형식을 사용하는 방법은 무엇입니까?
MPI_Datatype sub;
MPI_Type_vector(NX, NZ, NY*NZ, MPI_DOUBLE, &sub);
MPI_Type_commit(&sub);
을하지만 보낼 수 없습니다 (작동하지 않습니다 내 원하는 비행기). 뭐가 잘못 되었 니? 내 테스트 코드는 여기에 있습니다 : 3 차원 매트릭스와
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc,char ** argv)
{
int const IE=100,JE=25,KE=100;
int size,rank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Datatype sub;
MPI_Type_vector(KE,IE,IE+(JE-1)*IE,MPI_DOUBLE,&sub);
MPI_Type_commit(&sub);
if (rank==0){
double*** a=new double**[IE];
for(int i=0;i<IE;i++){
a[i]=new double *[JE];
for(int j=0;j<JE;j++){
a[i][j]=new double [KE];
}
}
for(int i=0;i<IE;i++){
for(int j=0;j<JE;j++){
for(int k=0;k<KE;k++){
a[i][j][k]=2;
}}}
for(int i=0;i<IE;i++){
for(int j=0;j<JE;j++){
a[i][j][0]=2;
}}
MPI_Send(&a[0][0][0],1,sub,1,52,MPI_COMM_WORLD);
}
if (rank==1){
double*** b=new double**[IE];
for(int i=0;i<IE;i++){
b[i]=new double *[JE];
for(int j=0;j<JE;j++){
b[i][j]=new double [KE];
}
}
for(int i=0;i<IE;i++){
for(int j=0;j<JE;j++){
for(int k=0;k<KE;k++){
b[i][j][k]=0;
}}}
MPI_Recv(&b[0][0][0][0],1,sub,0,52,MPI_COMM_WORLD,&status);
for(int i=0;i<IE;i++){
for(int j=0;j<JE;j++){
for(int k=0;k<KE;k++){
if(b[i][j][k]>0){
cout<<"b["<<i<<"]["<<j<<"]["<<k<<"]="<<b[i][j][k]<<endl;
}}}}
}
MPI_Finalize();
}
... 난 그보다 더 많은 정보가 필요합니다. 무엇을 시도 했습니까? 어떻게 문제가 있습니까? –
int a_size [3] = {100,25,100}; int subside [3] = {100,1,100}; int start [3] = {0,0,0}; int order = 1; MPI_Type_create_subarray (3, asside, sideside, start, order, MPI_DOUBLE, &sub); (100 * 25 * 100 행렬을 가지고 있고 일정한 NY에서 한 프로세스에서 다른 프로세스로 평면을 보내려합니다) 위의 코드는 배열의 다른 구성 요소를 전송합니다. 내 원하는 비행기 – peaceman
어떻게 송수신 전화합니까?그리고 주문은 MPI_ORDER_C가되어야한다. 1은 아니지만 2 가지가 특정 임 플 레이션에 대해 동일 할 수도있다. –