2014-12-07 71 views
0

我有一個任務,我需要使用OpenMPI,在這裏我需要創建一個新的數據類型來發送消息,因此我搜索了這個並找到了一些東西。MPI派生的數據類型

以下的教程中,我這樣做後:

typedef struct { 

    int a; 
    int b; 

}SpecialData; 

SpecialData p,q,vector[size]; 
MPI_Datatype tipSpecial , oldType[2]; 
int noBlocks[2]; 
MPI_Aint offsets[2],extent; 

MPI_Init(&argc, &argv); 

MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 

// setup the 7 double fields 
offsets[0] = 0 ; 
oldType[0] = MPI_DOUBLE; 
noBlocks[0] = 7; 

//setup the 4 int fields of the struct 
MPI_Type_extent(MPI_DOUBLE, &extent); 
offsets[1] = 8 * extent; 
oldType[1] = MPI_INT; 
noBlocks[1] = 4; 
MPI_Type_struct(2, noBlocks, offsets, oldType, &tipSpecial); 
MPI_Type_commit(&tipSpecial); 
///... Some code here where I do things based on the rank. 
p.a = 9; 
p.b = 9; 


MPI_Send(p, 1, tipSpecial, 0, tag, MPI_COMM_WORLD); 
MPI_Recv(q,1, tipSpecial, 0, tag, MPI_COMM_WORLD, &status); 

我在送得到一個錯誤,並在第一個參數專門接收。

Error: 
Main.c: In function ‘main’: 
Main.c:125:3: error: incompatible type for argument 1 of ‘MPI_Send’ 
    MPI_Send(p, 1, tipSpecial, 0, tag, MPI_COMM_WORLD); 

任何想法爲什麼會發生這種情況?

+0

你還應該包括什麼錯誤信息你得到 – 2014-12-07 15:39:54

+0

你應該提供'MPI_Send'和'MPI_RECV '帶有指向數據的指針,即'&p'和'&q'。 – 2014-12-07 16:00:01

+0

我不能相信這是造成這種情緒的原因。非常感謝你。如果你可以請發表你的回覆@HristoIliev所以其他人都可以看到它 – tudoricc 2014-12-07 16:04:28

回答

2

MPI_SendMPI_Recv都希望指向數據緩衝區的指針作爲它們的第一個參數。不像陣列,以獲得一個標量變量的地址,就必須使用引用操作符&

MPI_Send(&p, 1, tipSpecial, 0, tag, MPI_COMM_WORLD); 
//  ^
MPI_Recv(&q, 1, tipSpecial, 0, tag, MPI_COMM_WORLD, &status); 
//  ^
+0

有一件事。現在,當我嘗試收到我得到的東西錯誤代碼7(總線錯誤),是因爲特殊類型的對象沒有被初始化或者爲什麼? – tudoricc 2014-12-07 19:21:53

+0

隨着您引入的更改,派生的MPI數據類型不再與結構相匹配。 – 2014-12-07 21:52:11

+0

是的,你是對的,因爲那是偏移矢量。 – tudoricc 2014-12-07 21:53:15