2012-02-01 71 views
3

我在不同的vector<double>上乘以常數vector<bool>多次。我不知道這個速度有多快,首先將它轉換爲vector<double>,這樣sse可以用嗎?double * bool乘法有多快,它可以被矢量化嗎?

void applyMask(std::vector<double>& frame, const std::vector<bool>& mask) 
    { 
     std::transform(frame.begin(), frame.end(), mask.begin(), frame.begin(), [](const double& x, const bool& m)->double{ return x*m;}); 
    } 
+3

你能告訴我們你的代碼現在看起來像什麼嗎? – Mysticial 2012-02-01 09:18:17

+0

對不起,我沒有注意到矢量和載體被剝離到只是矢量。 – Slava 2012-02-01 09:35:37

+1

你如何將「double」與「bool」相乘?如果爲false,設爲零?或者我錯過了什麼? – Mysticial 2012-02-01 09:36:49

回答

5

好像你正在使用的vector<bool>口罩試圖零部件一個vector<double>的。

現在看來,它不是矢量化的。此外,模板專門化將阻礙編譯器執行任何類型的自動矢量化的能力。

所以你基本上有兩種選擇:

最簡單的辦法是確實vector<bool>轉換爲相應的零和一的vector<double>。然後問題簡化爲相同數據類型的矢量 - 矢量乘法,這是完全可以矢量化的。 (甚至自動向量化)

更難的方式(可能更快),與_mm_and_pd_mm_blendv_pd()內部函數/指令玩一些黑客。但是這需要更多的工作,因爲您必須手動矢量化代碼。


我建議你只是用簡單的方法去。除非您真的需要,否則無需進入手動矢量化。