2011-10-18 91 views
1

我正在構建一個MPI應用程序。爲了減少正在傳輸的消息的大小,我正在考慮使用「位」表來表示bool表(因爲bool值只能取兩個值中的一個:truefalse)。對我來說這很重要,因爲溝通是我應用程序中的主要性能瓶頸。我可以聲明一個位表嗎?

是否可以創建這種表?此數據類型是否存在於MPI API中?

+1

我不太瞭解這個要求。 –

+0

我認爲你的意思是MPI:http://en.wikipedia.org/wiki/Message_Passing_Interface –

+2

爲什麼不發送ints,在其中編碼你的位? – PlasmaHH

回答

4

在C++ std::bitsetboost::dynamic_bitset可用於管理一些位。如果比特集的大小不固定,請選擇稍後。 AFAIK MPI使用MPI_SendMPI_Rec進行進程間通信。如何序列化輸出並通過這些接口發送它們是另一回事,因爲Boost.Serialization不支持這兩種類型。

+0

一個很好的通用答案,但我打賭提問者對MPI界面更感興趣。 –

+0

@MarkRansom我希望OP知道如何在MPI中使用用戶定義的類型。否則,整個問題似乎毫無意義。 – pmr

1

基於原始問題中的標記,我假設您正在使用Fortran和C++的混合。用於Fortran的MPI綁定具有數據類型MPI_LOGICAL,您可以在消息傳遞調用中輕鬆使用該數據類型。我不知道這種類型的MPI C綁定。正如PlasmaHH所建議的,在這種情況下,發送整數可能適合您。

https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types

1

簡短的回答 - 不,最短的MPI數據類型是MPI_BYTE,你不能創建一個類型,只是有點。 (Fortran綁定具有MPI_LOGICAL,它對應於本地邏輯類型,但幾乎總是對應於int或可能是一個字節,而不是一點)。

現在,這不一定是一個問題;如果你有一個比特數組,你可以將它舍入到下一個完整的字節數中,然後發送它,而忽略最後幾個比特。 (無論如何,這幾乎是你在創建表格時必須做的)。但我有一些問題。

你的消息有多大?你的網絡是什麼?你是當然你是帶寬有限,而不是延遲限制?

如果你的信息很小(比如在MB下),那麼你很可能會受到消息延遲而不是帶寬的影響,並且減小消息大小也無濟於事。 (您可以使用pingpong測試來估計這一點 - 例如在Intel MPI benchmarks中 - 查看您的有效帶寬級別是多少)。如果這是你所處的政權,那麼這可能會讓事情變得更糟,而不是更好,因爲溝通不會加速,但索引到位陣列的額外成本可能會減慢速度。另一方面,如果你發送大量消息(比如MB大小)和/或你的內存有限,這可能是件好事。

0

我會將你的位轉換爲一個整數數組。

我會回答關於FORTRAN的語言。 您可以使用內部位操作來回移動位。

同樣爲了清除,您不應該使用FORTRAN類型LOGICAL,因爲它與常規整數一樣是4字節變量。 使用這些功能:

BIT_SIZE(I) 
IBCLR(I, POS) ! Set to 0 in variable I at position POS 
IBSET(I, POS) ! Set to 1 in variable I at position POS 
BTEST(I, POS) ! To test if bit at POS is 1 

然後做任何類型的你正在處理的正常傳輸。您可以在MPI通信中添加標籤,讓接收者知道它是一個應按位處理的變量。 這應該限制您的溝通,但需要打包數據和外包裝。無論如何,你也可以將所有的BOOL錶轉移到這個方案中。

但應該注意的是,您的BOOL表必須廣泛大才能看到任何效果,我們說多大?

相關問題