Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C+中,两个/四个线程比单线程做向量内积还要慢+;11多线程复制?_C++_Multithreading_C++11 - Fatal编程技术网

C++ 为什么在C+中,两个/四个线程比单线程做向量内积还要慢+;11多线程复制?

C++ 为什么在C+中,两个/四个线程比单线程做向量内积还要慢+;11多线程复制?,c++,multithreading,c++11,C++,Multithreading,C++11,参考c++11多线程,我尝试使用多线程来计算向量点积结果。这里的基本思想是,我们把向量分成两到四个部分,同时计算每个部分的部分和。并在同步两个线程tak后进行求和。在这里,我只使用CPU和RAM资源。此外,我尝试创建一个大向量来覆盖线程头 这里的问题是,两个/四个线程甚至比单个线程慢。但是当使用两个线程时,CPU利用率要高得多。因此,我相信程序使用了两个物理核 平台和运行时间结果如下所示。有人说跑步时间要长一点。我不确定效率是否与操作系统有关。我还没有在Linux中测试代码,有人帮我做测试吗?

参考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:要知道,如果你没有这样说,所有这些基本上无用的讨论都不会发生:“我实际上使用的是发布。”