2013-05-08 71 views
1

我想比較Blitz ++/Armadillo/Eigen和我自己的庫的性能。閃電戰++:用隨機數填充數組

我目前在做以下使用Blitz ++:

... 
Array<T, 1> s(samples); 
Uniform<T> rand; 
rand.seed((unsigned int)time(0)); 
for(size_t i=0; i<samples; i++) { 
    s = rand.random() *4.0 +58.0; 
} 
... 

爲了公平起見,我需要知道填充隨機數的數組的正確的「閃電戰++」的方式。 我認爲上面的代碼片段不是做這件事的方法,因爲這是非常低效的。

總之

是對上面的片段使用閃電++初始化時利用隨機數的陣列的正確方式或是有更好/更高效的方法?

+0

請記住,通過這些類型的比較,您最終可以將蘋果與橘子進行比較。例如,在Armadillo中有[訪問元素](http://arma.sf.net/docs.html#element_access)的幾種方法:operator(),operator [],iterators或memptr()。默認情況下,operator()具有啓用邊界檢查功能,而其他方式則不啓用。這有助於開發。因此,爲了進行更平衡的比較,您還需要考慮使用特定庫(包括調試!)開發軟件需要多長時間,以及最終代碼的可讀性/可維護性。 – mtall 2013-05-09 03:31:40

+0

@mtall,我同意比較這些類型的庫時需要考慮多個方面。但不是所有的蘋果和梨......你只需要比較它們。因此,我並沒有比較一個庫的元素訪問和另一個庫的全陣列操作。但分離比較:全陣列操作,模板/視圖,基於元素的操作,初始化/生成器。 – safl 2013-05-13 09:39:00

+0

即使有更多的考慮。例如,許多C++庫可以使用各種BLAS後端進行全陣列操作。是否比較標準的BLAS或高度優化的版本,如OpenBLAS或Intel MKL?整陣列操作也受到矩陣是動態分配還是固定大小(即大小指定爲模板參數)的影響。在後一種情況下,C++編譯器可能會生成更好的代碼。這反過來帶來了關於給定編譯器的能力的問題,例如。對於給定的代碼片段,一個編譯器可能優於另一個編譯器。 – mtall 2013-05-15 01:28:46

回答

1

當我在寫我的問題時,我意識到我的方式錯誤。

的問題的答案是:

你做錯了,做它像這樣:

... 
Array<T, 1> s(samples); 
Uniform<T> rand; 
rand.seed((unsigned int)time(0)); 
s = rand.random() *4.0 +58.0; 
... 

所以,現在的問題是,是我自己的答案是否正確?