C中的多线程程序显示与串行程序相同的性能

我只想在C中编写一个简单的程序,它创建两个线程,每个线程用整数的平方(0,1,4,9,…)填充向量.

这是我的代码:

#include <iostream>
#include <vector>
#include <functional>
#include <thread>
#include <time.h>

#define MULTI 1
#define SIZE 10000000

void fill(std::vector<unsigned long long int> &v, size_t n)
{
    for (size_t i = 0; i < n; ++i) {
        v.push_back(i * i);
    }
}

int main()
{
    std::vector<unsigned long long int> v1, v2;
    v1.reserve(SIZE);
    v2.reserve(SIZE);
    #if !MULTI
    clock_t t = clock();
    fill(v1, SIZE);
    fill(v2, SIZE);
    t = clock() - t;
    #else
    clock_t t = clock();
    std::thread first(fill, std::ref(v1), SIZE);
    fill(v2, SIZE);
    first.join();
    t = clock() - t;
    #endif
    std::cout << (float)t / CLOCKS_PER_SEC << std::endl;
    return 0;
}

但是,当我运行我的程序时,我看到,串行版本和并行版本之间没有显着差异(或者有时并行版本显示更糟糕的结果).
知道会发生什么吗?

最佳答案 当我在i7上使用MSVC2015执行代码时,我观察到:

>在调试模式下,多线程为14s,而单线程为26s.所以几乎快了两倍.结果如预期.
>在发布模式下,多线程为0.3,而单线程为0.2,因此它的速度较慢,正如您所报道的那样.

这表明您的问题与优化的fill()与创建线程的开销相比太短的事实有关.

还要注意,即使在fill()中有工作要做(例如未经优化的版本),多线程也不会将时间乘以2.多线程将增加多核处理器上的每秒总吞吐量,但是单独采用的每个线程可能比平时稍微慢一点.

编辑:其他信息

多线程性能取决于很多因素,例如处理器上的内核数量,测试期间运行的其他进程使用的内核,以及doug在评论中评论的多线程任务的配置文件(即记忆与计算).

为了说明这一点,这里的非正式基准测试结果显示,对于内存密集型而言,单个线程吞吐量的降低要比浮点密集型计算快得多,并且全局吞吐量增长得慢得多(如果有的话):

《C中的多线程程序显示与串行程序相同的性能》

为每个线程使用以下函数:

// computation intensive
void mytask(unsigned long long loops)
{
    volatile double x; 
    for (unsigned long long i = 0; i < loops; i++) {
        x = sin(sqrt(i) / i*3.14159);
    }
}

//memory intensive
void mytask2(vector<unsigned long long>& v, unsigned long long loops)
{
    for (unsigned long long i = 0; i < loops; i++) {
        v.push_back(i*3+10);
    }
}
点赞