2014-03-30 32 views
0

我使用的Visual Studio編寫Windows中的類時,它的一個公共職能有很大的for循環看起來像下面,慢循環使用地板和std ::設置

void brain_network_opencl::block_filter_fcd_all(int m) 
{ 
    const int m_block_len = m * block_len; 
    time_t start, end; 
    for (int j = 0; j < shift_2d_gpu[1]; j++) // local work size/number of rows per block 
    { 
    for (int i = 0; i < masksize; i++) // number of extracted voxels 
    { 
     if (j + m_block_len != i) 
     { 
      //if (floor(dst_ptr_gpu[i + j * masksize] * power_up) > threadhold_fcd) 
      if ((int)(dst_ptr_gpu[i + j * masksize] * power_up) > threadhold_fcd) 
      { 
       org_row = mask_ind[j + m_block_len]; 
       org_col = mask_ind[i]; 

       nodes.insert(org_row); 
       conns.insert(make_pair(org_row, org_col)); 
      } 

     } 
    } 
} 
end = clock(); 
cout << end - start << "ms" << " for block" << j << endl; 
} 

哪裏nodesstd::set<set>connsstd::multimap<int, int>mask_indstd::vector<int>,它們被聲明爲私有變量以及masksize和shift_2d_gpu;

主要時間成本按floor.insert;

問題是,主函數中的相同代碼(包含所有變量)的成本僅比它從這裏調用的時間多1/5〜1次。如果我在函數和main()函數中用floor替換(int),則在這個函數中花費更多;

是什麼原因導致這個問題,我必須把它寫在main()裏面嗎? 順便問一下這跟overloads有什麼關係? floor顯示+3 overloads.insert顯示+5 overloads

更新

我這個函數的代碼複製到另一個新的控制檯項目的主要功能。 它仍然比我的第一個功能(代碼也主要)慢得多! 現在我很困惑... 它有什麼設置使floor.insert更快?

更新2014/03/31

這是因爲在項目屬性 - 設置>配置屬性 - > C/C++ - >常規 - >調試信息格式,這個值設置爲P * 程序數據庫編輯並繼續(/ ZI) *爲默認設置,並且與根據msdn進行的大量優化不兼容。如果此值設置爲程序數據庫(/ Zi),則floor的時間成本不會是(int)的10倍。

(我看着拆卸並發現代碼的長度(call floor - >jmp floor - >不同的代碼)是當設置被改變的不同,這就是原因導致floor.insert花了更多的時間比它應該)

+0

可能會感興趣:[爲什麼floor()如此緩慢?](http://stackoverflow.com/questions/824118/why-是樓那麼慢)。 – Gassa

+0

這不是我要找的答案,謝謝你的努力。 – kbxu

回答

0

正如加薩指出的那樣,爲了優化密閉循環使用custom floor function

set<int>不是緩存友好的,但用緩存友好的結構代替它,你可能需要改變算法。儘管如此,unordered_set<int>擁有相當的空間,但應該會更好一些,每個插入的緩存未命中數量比二叉樹少。

P.S. C++中的非虛擬重載在編譯時解決,並且對性能沒有影響

+0

我會嘗試unordered_set 看看它是否有助於減少時間,謝謝。 – kbxu