gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:34 25 4
gpt4 key购买 nike

我只想用 C++ 编写一个简单的程序,它创建两个线程,每个线程都用整数(0、1、4、9、...)的平方填充 vector 。这是我的代码:

#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 执行您的代码时,我观察到:

  • 在 Debug模式下,多线程是 14 秒,而单线程是 26 秒。所以它的速度几乎是原来的两倍。结果如预期。
  • 在 Release模式下,多线程为 0.3,而单线程为 0.2,因此速度较慢,正如您所报告的那样。

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

另请注意,即使在 fill() 中有足够的工作要做(例如未优化的版本),多线程也不会将时间乘以二。多线程将提高多核处理器的每秒总吞吐量,但单独使用的每个线程的运行速度可能会比平时慢一点。

编辑:附加信息

多线程性能取决于很多因素,例如处理器上的核心数、测试期间运行的其他进程使用的核心数,以及 doug 所评论的 在他的评论中,多线程任务的概况(即内存与计算)。

为了说明这一点,这里是一个非正式基准测试的结果,该结果表明内存密集型计算的单个线程吞吐量下降速度比浮点密集型计算快得多,并且全局吞吐量增长慢得多(如果有的话):

enter image description here

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

// 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);
}
}

关于c++ - C++ 中的多线程程序显示出与串行程序相同的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35525543/

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