2014-02-26 46 views
17

我一直在努力,我想以前一直使用編譯G ++ 4.8.1與參數什麼已知的性能差使用-std =當發現GNU ++ 11

CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11 

我遺傳算法沒有使用許多的C++ 11的特徵,並且具有合理的資料配置系統,所以我替換的代碼字面上3-4線,把它編譯不-std = GNU ++ 11

CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native 

當我再次運行我的分析器,我發現幾乎在任何地方我都能看到〜5%的性能提升,除了我的分類函數whi現在需要約兩倍的時間。 (這是一個重載運算符<的對象)

我的問題是:

兩個版本之間已知有什麼性能上的差異,而它預計C++ 11將是新的編譯器速度更快?

我也期待着我正在使用的事實-Ofast正在扮演一個角色,我對我的假設是否正確?

UPDATE:

至於建議中的意見,我進行的測試中再次使用和不使用-march =本地

// Fast sort, slightly slower in other tests 
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11 

// Fast sort, slower in other tests 
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -std=gnu++11 

// Slow sort, slower in other tests 
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse      

// Slow sort, fastest in other tests 
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native 

的結論似乎是相同的使用-std = GNU ++ 11幾乎在其他任何地方都會受到輕微的懲罰,加速排序。 -march =本地加速程序,無論何時使用。

鑑於這種排序只在每一代中被調用一次,我將利用-std = gnu ++ 11編譯速度,但我仍然對造成這些結果的原因非常感興趣。我使用的是// STD

::從排序的#include

+1

至於性能改進:在標準庫容器和算法中移動語義。然而,看到排序功能中涉及的代碼會很好,2倍速放慢是可疑的。順便說一句:'-std = gnu ++ 11'也啓用GNU擴展;你可能需要'-std = C++ 11',而不是。 – Ali

+1

可能相關:-Ofast支持根據C++標準無效的優化。 –

+0

@ R.MartinhoFernandes是的,但它在兩種情況下都使用,所以區別來自C++ 11功能或某些GNU擴展。然而,沒有看到實際的代碼,我們不知道爲什麼排序慢兩倍。 – Ali

回答

0

只要一直在爲什麼排序方法有這樣的性能下降很大的興趣。

我更感興趣的是,爲什麼剩下的代碼看到了很好的改善,而是幫助交談,下面是我的代碼是在-std = GNU ++ 11

其更快的只是唯一的部分比較矢量對象成員上的雙精度值。

class TvectorPM { 
public: 
    pthread_mutex_t lock; 
    std::vector<PopulationMember> v; 
    void add(PopulationMember p); 
}; 

void TvectorPM::add(PopulationMember p) { 
    pthread_mutex_lock(&lock); 
    v.push_back(p); 
    pthread_mutex_unlock(&lock); 
} 


class PopulationManager { 
public: 
    TvectorPM populationlist; 
} 


void PopulationManager::sortByScore() { 
    // Have overloaded operator< to make this fast 
    sort(populationlist.v.begin(),populationlist.v.end()); 
} 


class PopulationMember { 
public: 
    bool hasChanged; 
    double score; 

    inline bool operator< (const PopulationMember& rhs) const{ 
     return this->score < rhs.score; 
    } 
+0

我猜想編譯器能夠改善這種情況,所以如果我能弄明白爲什麼,那麼把它帶回到舊版本的g ++ – joeButler

+0

你有沒有試過--std = C++ 11而不是gnu ++ 11?這可能有助於解決導致差異的原因。 – cshelton

-5

C++11不同於舊版本的多個方面。該語言的原始核心也進行了許多增強。
此外,還添加了一些附加功能。您可以訪問this網頁,並使用C++11標籤查看商品。
一些輕微的,但頻繁使用的功能 -

1. initializer list for `vectors`<br> 
2. range based `for` loop<br> 
3. the `auto` keyword, for declaring data types, <br> 
4. the 'uniform initialization syntax', in its full glory 

,也是-std=c++11標誌必須使用能夠享受上述任何功能。

至於性能問題,可能只是巧合。但可以肯定的是,多次運行編譯。

+1

-1這根本不回答問題 – Manu343726

0

我相信這可以歸結爲GNU增加的功能(documentation on GNU Extensions)。

這些擴展可能會以合理的方式優化某些功能,併爲其他功能提供額外開銷,因爲性能取決於代碼的形狀。

很抱歉,我無法提供詳情。

1

我不確定爲什麼使用--std = gnu ++ 11會使部分代碼變慢。我個人不使用它(相反,我使用--std = C++ 11)。也許額外的GNU功能正在放慢速度?更有可能的是,優化還沒有趕上新的語言功能。

至於爲什麼分類部分是快,我有一個合理的解釋:

您啓用了移動語義。即使你自己沒有明確寫出它們,如果你的課程是合理構建的,它們也會被生成。 「排序」算法可能會利用它們。

但是,上面列出的類似乎沒有太多存儲空間。但是,它沒有「交換」方法,因此如果沒有C++ 11移動語義,排序例程必須做更多的工作。您可以查看this question and answers瞭解更多關於排序和移動語義以及與編譯器選項交互的信息。

相關問題