簡體   English   中英

std::transform 比 for 循環慢

[英]std::transform slower than for loops

我考慮過實現一個矩陣 class ,它使用算法中的std::transform進行計算,但我發現在某些情況下編寫循環更快。

看看 add operator+=用於元素明智的添加。 如果 rhs 矩陣有 1 col 而行數與 lhs 矩陣相同,我可以執行以下操作:

for (auto c = 0; c < cols(); ++c) {
    std::transform(std::execution::par, col_begin(c), col_end(c), rhs.begin(), col_begin(c), std::plus<>());
}

或使用簡單的循環:

auto lhsval = begin();
auto rhsval= rhs.begin();

for (auto r = 0; r < rows(); ++r) {
   for (auto c = 0; c < cols(); ++c) {
       *lhsval += *rhsval;
       ++lhsval;
   }
   ++rhsval;
}

為了您的信息,我寫了一個接受一個步驟的迭代器。 所以col_begin()返回一個迭代器,它將跳過operator++中的其他列

我使用谷歌基准測試了兩種實現之間的差異,並得出結論,循環比使用 std::transform 快大約 5 倍。 好吧,也許應該有區別,但沒有那么大的區別。

您可以在我的 github repo中查看完整代碼

矩陣 class 矩陣迭代器

傳遞std::execution::par是要求庫並行化此操作。 這會增加開銷,即使只是為了確定“您的問題太小而無法並行化”。 在並行化值得之前,被轉換的元素數量必須非常大(有時數十萬或數百萬),並且需要您擁有適當的硬件(在兩核機器上並行化比在64 核機器)。

for循環版本更類似於沒有std::execution::par參數的普通std::transform 如果您刪除該參數並且性能差異仍然很大,請使用該信息更新您的問題,以及您的編譯器版本、平台、編譯器開關和有關您的數據集的信息:行數/列數等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM