[英]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中查看完整代碼
傳遞std::execution::par
是要求庫並行化此操作。 這會增加開銷,即使只是為了確定“您的問題太小而無法並行化”。 在並行化值得之前,被轉換的元素數量必須非常大(有時數十萬或數百萬),並且需要您擁有適當的硬件(在兩核機器上並行化比在64 核機器)。
for
循環版本更類似於沒有std::execution::par
參數的普通std::transform
。 如果您刪除該參數並且性能差異仍然很大,請使用該信息更新您的問題,以及您的編譯器版本、平台、編譯器開關和有關您的數據集的信息:行數/列數等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.