C++ 为什么在C+中,两个/四个线程比单线程做向量内积还要慢+;11多线程复制?
参考c++11多线程,我尝试使用多线程来计算向量点积结果。这里的基本思想是,我们把向量分成两到四个部分,同时计算每个部分的部分和。并在同步两个线程tak后进行求和。在这里,我只使用CPU和RAM资源。此外,我尝试创建一个大向量来覆盖线程头 这里的问题是,两个/四个线程甚至比单个线程慢。但是当使用两个线程时,CPU利用率要高得多。因此,我相信程序使用了两个物理核 平台和运行时间结果如下所示。有人说跑步时间要长一点。我不确定效率是否与操作系统有关。我还没有在Linux中测试代码,有人帮我做测试吗? 任何帮助都将不胜感激。 这是我的线程实现:C++ 为什么在C+中,两个/四个线程比单线程做向量内积还要慢+;11多线程复制?,c++,multithreading,c++11,C++,Multithreading,C++11,参考c++11多线程,我尝试使用多线程来计算向量点积结果。这里的基本思想是,我们把向量分成两到四个部分,同时计算每个部分的部分和。并在同步两个线程tak后进行求和。在这里,我只使用CPU和RAM资源。此外,我尝试创建一个大向量来覆盖线程头 这里的问题是,两个/四个线程甚至比单个线程慢。但是当使用两个线程时,CPU利用率要高得多。因此,我相信程序使用了两个物理核 平台和运行时间结果如下所示。有人说跑步时间要长一点。我不确定效率是否与操作系统有关。我还没有在Linux中测试代码,有人帮我做测试吗?
#include<iostream>
#include<thread>
#include<vector>
#include<mutex>
#include<ctime>
#include<numeric>
#include<iterator>
using namespace std;
vector<int> boundary(int num, int parts)
{
vector<int >bounds;
int delta = num / parts;
int remainder = num % parts;
int prev = 0, next = 0;
bounds.push_back(prev);
for(int i = 0; i < parts; i++)
{
next = prev + delta;
if(i == parts - 1)
next = next + remainder;
bounds.push_back(next);
prev = next;
}
return bounds;
}
void dot_product(const vector<int>& v1, const vector<int>& v2, int& result, int L, int R, int tid)
{
int partial_sum = 0;
for(int i = L; i < R; i++)
partial_sum += v1[i] * v2[i];
//lock_guard<mutex> lock(barrier);
//cout << "tid: " << tid<< endl;
result = partial_sum;
}
int main(int argc, char* argv[])
{
clock_t start, end;
int numOfElement = 500000000;
// Change the thread number here
int numOfThread = 2;
int result[numOfThread] = {0};
vector<thread> threads;
// Fill two vectors with some values
vector<int> v1(numOfElement, 1), v2(numOfElement, 2);
// Split numOfElement into nr_threads parts
vector<int> limits = boundary(numOfElement, numOfThread);
start = clock();
// Launch multi_threads:
for(int i = 0; i < numOfThread; i++)
threads.push_back(thread(dot_product, ref(v1), ref(v2), ref(result[i]), limits[i], limits[i+1], i));
// Join the threads with the main thread
for(auto &t:threads)
t.join();
int sum = accumulate(result, result+numOfThread, 0);
end = clock();
//cout << limits[0] <<" " << limits[1]<<" "<<limits[2]<<endl;
cout << "results: " << sum << " time elapsed: "<< double(end - start) / CLOCKS_PER_SEC << endl;
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
矢量边界(整数,整数部分)
{
向量界;
int delta=num/个零件;
整数余数=num%零件;
int prev=0,next=0;
边界。推回(上一个);
对于(int i=0;i //可能还存在一些缓存一致性问题。线程在一些相同的数据块上运行。这可能意味着它们不能像以前那样积极地使用缓存。@n.m.:clock
的标准定义对多线程程序来说不是定义得很好吗?Windows的定义似乎很好。@Jens不在最新的VS ve上rsions。从VS2010开始,它在发布模式下被禁用。@user3409554:在第一条评论中,当有人问你是在“调试”模式还是在“发布”模式时,你说你在使用“发布”。你在这里犯了一个错误。如果你没有优化代码(和/或链接到标准库的调试版本),那么你就处于错误状态“调试”模式,而不是“发布”模式。然而,从技术上讲,这个术语只适用于Visual Studio,但我想其他编译器的用户至少应该知道人们在说“在调试或发布模式下构建”时指的是什么“@user3409554:要知道,如果你没有这样说,所有这些基本上无用的讨论都不会发生:“我实际上使用的是发布。”