2013-06-05 46 views
1

我編寫了一個執行福克斯算法與MPI在C中。 我已經將我的global_matrix細分爲更小的塊。因此,每個過程都有一個矩陣A和矩陣B的小塊。然而,我無法理解如何實現Fox算法:在互聯網上發現的很多代碼正在執行以下操作。福克斯算法與MPI

Implementation for Fox Algorithm

我不明白:在過去的幻燈片,有C代碼應該實現的算法。但似乎temp數組從未正確初始化,因此在MPI_Bcast()和矩陣乘法中使用時會導致奇怪的行爲。

我認爲我的算法幾乎可以工作,但是我的結果值肯定是錯誤的。

(如果你需要我可以提供代碼)

謝謝您的回答!

回答

1

雖然不回答你原來的問題我只能說此話並MPI_Bcastmatrixmult採取tmp作爲else塊中的第一個參數,也許使用它作爲一個目標來存儲變量。不知道tmp是否使用unitialised。

另外malloc-allocated memory can sometimes be 0 initalised雖然這不是我會依賴的行爲。

最後,如果您打算使用幻燈片don't cast the result of malloc中的代碼。

+0

非常感謝。 將嘗試使其工作。如果我成功了(我懷疑:P),我會發布幫助我的東西。 –

+0

高興地幫助,是的,當你得到一些工作時請張貼一些代碼,如果我不能幫助其他人會超過:) – Nobilis

1

因此,我幾乎在問完問題後才找到解決方案。爲了儘可能詳盡,我將代碼推送到github。請記住,這是一個學校項目,並沒有完全完成和正確。此外,評論可能有點奇怪:我不是以英語爲母語的人。 My code on github

Nobilis有答案:MPI_Bcast不只是一個函數發送數據,但也接收一些。應由接收數據的每個進程和發送方調用MPI_Bcast。 這就是如果我寫。

int* int_array = malloc(10*sizeof(int)); 
int root = 0; 

if(my_rank == 0) 
{ 
    for(int i=0; i<10; ++i) 
     int_array[i] = i; 
} 

MPI_Bcast(int_array, 10, MPI_INT, root, MPI_COMM_WORLD); 

此代碼表示:對於每個由MPI啓動的processus分配10個int。然後,僅對於0級的processus,將一些有效數據放入先前分配的數組中。 然後每個進程都調用MPI_Bcast使用相同的參數:應該寫入數據的內存(或者在my_rank == 0的情況下應該從何處發送),數據的大小和類型(是數組還是隻有一個int?),您可以定義將數據發送到MPI_COMM_WORLD中的每個進程的根。

這就是爲什麼我們不關心int_array是否在大多數進程中沒有被初始化(除了my_rank == root的進程)。

請注意,您可以使用MPI_Datatype以特定佈局發送數據。 如果是這樣,你應該瞭解:

  • MPI_Type_create_subarray
  • MPI_Type_create_resized
  • MPI_Type_commit

希望能幫助別人。