首页 > 解决方案 > c ++:stl并行算法没有执行性能

问题描述

我写了一个简单的程序来查看并行算法的执行性能。这是代码:

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

int main()
{
    std::vector<float> data(1000000, 0);
    std::iota(std::begin(data), std::end(data), 0);

    auto t1 = std::chrono::high_resolution_clock::now();

    for (auto& item : data) {
        item = item*item;
    }

    auto t2 = std::chrono::high_resolution_clock::now();

    /* Getting number of milliseconds as a double. */
    std::chrono::duration<double, std::milli> ms_double = t2 - t1;
    std::cout << "non-optimized version : " << ms_double.count() << " milisecs" << std::endl;

    std::iota(std::begin(data), std::end(data), 0);

    t1 = std::chrono::high_resolution_clock::now();

    std::for_each(std::execution::par, std::begin(data), std::end(data),
                  [](float& item) {
        item = item*item;
    });

    t2 = std::chrono::high_resolution_clock::now();

    ms_double = t2 - t1;
    std::cout << "paralell version : " << ms_double.count() << " milisecs" << std::endl;

    return 0;
}

但令我惊讶的是,无论向量中的数据量如何,我都没有看到任何改进。STL算法有什么问题。编译器是 gcc-10

标签: c++c++17

解决方案


一些标准库还没有实现并行版本。在 GCC ( libstdc++) 的情况下,一些算法是前一段时间实现的,但它们依赖于 Intel 的 TBB 库。

MSVC 标准库在这方面尤其领先,您将获得一个实际的并行版本,因此如果您在 Windows 上可以尝试该版本。

请参阅是否已实现 C++17 并行算法?了解更多信息。


附言。您的案例可以矢量化,因此您可以使用std::execution::par_unseq.


推荐阅读