2014-01-29 61 views
0

我有一個指針列表指針(列表中的每個指針指向一行) 我需要「散佈」指針列表,以便每個處理器都有一定數量的行。 我舉個例子來說明我想如何分配指針。 如果列表由5個指針組成,並且有2個處理器,我希望處理器0具有指針4 0 1 2 3,處理器1具有2 3 4 0(這意味着每個處理器具有前一個處理器的最後一個指針,下面處理器的指針)MPI發送revc指針

這是代碼的一部分:

int **vptr = NULL; 
if(rank==0){ 
    vptr = m.ptr(); 
} 
//this definition comes from one of my class methods 

然後我有這部分代碼即決定如何對行分配給每個處理(在每個處理器具有一開始就假設只有其他人沒有的行)

int *elem; 
elem = new int[p]; //number of rows for process 
int *disp; 
disp = new int[p]; //index first row of the process 
int split = N/p; 
int extra = N % p; 

    for(unsigned i = 0; i < extra; i++){ 
     elem[i] = split + 1; 
    } 
    for(unsigned i = extra; i < p; i++){ 
     elem[i] = split; 
    } 

    disp[0] = 0; 
    for(unsigned i = 1; i < p; i++){ 
     disp[i] = disp[i-1] + elem[i-1]; 
    } 

int local_n = elem[rank]; //number of rows for this process 
int local_f = disp[rank]; //index first row for this process 

int *local_v; 
local_v = new int[local_n + 2]; //+2 because now I consider that I also need the row above and the row below 

這裏我需要使用MPI_SEND和MPI_RECV,我想我做的erroror與指針

if(rank==0){ 
     for(unsigned j = 0; j < local_n + 2; j++){ 
      local_v[j] = *vptr[j]; 
     } 
     for(unsigned i = 1; i < p; i++){ 
      MPI_Send(&vptr[disp[i]-1], elem[i] + 2, MPI_INT, i, 1, MPI_COMM_WORLD); 
     } 
    }else{ 
     MPI_Recv(&local_v[0], local_n + 2, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    } 
+0

你的問題到底是什麼?你會得到編譯器錯誤或運行時問題? – Hulk

+0

我有一個分段錯誤...我認爲問題是在代碼的最後部分 – Wellen

+0

@HighPerformanceMark謝謝,我明白我的錯誤! – Wellen

回答

1

評論轉化追求虛榮的聲譽來回答......(和稍微崇高追求提供對於後代來說是可以接受的答案)

我不確定我完全理解你的代碼,但是從一個進程到另一個進程發送指針沒有意義。指針指向進程的本地地址空間中的位置,不能期望指向另一個進程的本地地址空間中的特定位置。事實上,他們不能指望繼續指向另一個進程的本地地址空間的任何位置

+0

這是否意味着我將被迫總是緩慢地發送數據並且從不通過引用?也可以詳細說明爲什麼MPI以這種方式工作,畢竟,即我的筆記本電腦上的4個內核共享相同的內存? (ofc不在更大的節點等更大的超級計算機) – AtmosphericPrisonEscape

+0

那麼有2個問題。但是我會換個說法:在我的帶4核的筆記本電腦上,我假設我已經共享了所有這些內存的內存,我可以運行OpenMP以及MPI代碼。然而,使用MPI發送,我將永遠不得不復制我的數據,這是緩慢的。我無法發送引用,這很快。 (正確嗎?)所以,因爲擁有共享內存OpenMP無論如何都是自然選擇,是嗎? – AtmosphericPrisonEscape

+0

你錯過了我的觀點 - 問一個問題。不要在評論中提出問題。 –