c++线程速度测试,我做得对吗?



我有这样一个简单的程序,它在8个线程中增加vector的每个元素1(我的PC上有8个内核)。但它只加速程序2.8倍,我做错了什么或多线程工作不是那么快?

Cost是599毫秒
800000000
Cost是1697毫秒
800000000

#include <iostream>
#include <thread>
#include <vector>
void test(int n, int k)
{
    std::vector<int> data(n * k, 0);
    std::vector<std::thread> threads(n);
    auto functor = [] (int *begin, int *end) {
        for (int *p = begin; p != end; p++) {
            *p = *p + 1;
        }
    };
    auto begin = std::chrono::steady_clock::now();
    for (int i = 0; i < n; i++) {
        threads[i] = std::thread(std::bind(functor, data.data() + i * k, data.data() + (i + 1) * k));
    }
    for (int i = 0; i < n; i++) {
        threads[i].join();
    }
    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin);
    std::cout << "Cost is " << elapsed .count() << " milliseconds" << std::endl;
    int sum = 0;
    for (int i = 0; i < n * k; i++) {
        sum += data[i];
    }
    std::cerr << sum << std::endl;
}
void stupid_test(int n, int k)
{
    std::vector<int> data(n * k, 0);
    std::vector<std::thread> threads(n);
    auto functor = [] (int *begin, int *end) {
        for (int *p = begin; p != end; p++) {
            *p = *p + 1;
        }
    };
    auto begin = std::chrono::steady_clock::now();
    for (int i = 0; i < n; i++) {
        functor(data.data() + i * k, data.data() + (i + 1) * k);
    }
    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin);
    std::cout << "Cost is " << elapsed .count() << " milliseconds" << std::endl;
    int sum = 0;
    for (int i = 0; i < n * k; i++) {
        sum += data[i];
    }
    std::cerr << sum << std::endl;
}
int main()
{
    test(8, 100000000);
    stupid_test(8, 100000000);
    return 0;
}

您的"8核"可能是4个超线程内核用于8个执行单元。它的最大速度为~5.2倍(4核,超线程的最大速度为~30%)。如果你只运行4个线程,速度可能不会有太大变化。

由于一些CPU资源(缓存)和内存在所有内核之间共享,因此这里的限制速度是来自8个执行线程的线性内存访问速度。即使只做2个线程也不会给2倍的加速

最新更新