我只想在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在评论中评论的多线程任务的配置文件(即记忆与计算).
为了说明这一点,这里的非正式基准测试结果显示,对于内存密集型而言,单个线程吞吐量的降低要比浮点密集型计算快得多,并且全局吞吐量增长得慢得多(如果有的话):
为每个线程使用以下函数:
// 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);
}
}