gpt4 book ai didi

c++ - C++标准库并行执行的for_each速度比顺序循环慢

转载 作者:行者123 更新时间:2023-12-02 09:58:00 35 4
gpt4 key购买 nike

从c++ 17开始,std库具有并行算法,因此我尝试使用以下代码,对数字列表求和,并想查看是否有任何性能提升。

#include <algorithm>
#include <chrono>
#include <execution>
#include <numeric>
#include <iostream>
#include <vector>

int main() {
size_t n = 100000000;
std::vector<size_t> vec(n);
std::iota(vec.begin(), vec.end(), 0);

auto par_sum = [&](size_t k) {
auto t1 = std::chrono::high_resolution_clock::now();

std::vector<size_t> rez(k);
std::iota(rez.begin(), rez.end(), 0);
size_t batch = static_cast<size_t>(n / k) + 1;
std::for_each(std::execution::par_unseq, rez.begin(), rez.end(),
[&](size_t id) {
size_t cum = 0;
for (size_t i = id*batch; i < std::min((id+1)*batch, n); ++i) {
cum += vec[i];
}
rez[id] = cum;
});

auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
std::cout << "n_worker = " << k
<< ", time = " << duration
<< ", rez = " << std::accumulate(rez.begin(), rez.end(), 0lu)
<< std::endl;
};

par_sum(1);
par_sum(3);
par_sum(5);
}
编译者
g++  -std=c++17 -L/usr/local/lib -O3 -mavx -ltbb a.cpp
结果表明
n_worker = 1, time = 51875, rez = 4999999950000000
n_worker = 3, time = 57616, rez = 4999999950000000
n_worker = 5, time = 63193, rez = 4999999950000000
问题,
  • 对1个 worker 没有绩效提高,为什么?
  • 最佳答案

    我认为,对于少量工作,可能会发生这样的情况:仅通过将内容保留在L1缓存上下文中,就可以在一个CPU中执行紧密循环。在同一数据上增加并行性的数量后,您就开始调用具有缓存一致性和页面错误的开销。
    您可能值得考虑一下计算缓存未命中次数的方法,例如此处建议的那些方法:
    Programmatically counting cache faults
    还请参见:
    What is a "cache-friendly" code?
    加上有关“缓存友好代码”和“面向数据的设计”的其他资源:
    https://www.youtube.com/watch?v=b5v9aElYU2I

    https://youtu.be/fHNmRkzxHWs
    这与错误共享有关,在此处进行了说明:
    https://www.youtube.com/watch?v=dznxqe1Uk3E

    关于c++ - C++标准库并行执行的for_each速度比顺序循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64324386/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com