C++ 多线程减慢了程序的速度:没有错误共享,没有互斥,没有缓存未命中,没有小的工作负载

C++ 多线程减慢了程序的速度:没有错误共享,没有互斥,没有缓存未命中,没有小的工作负载,c++,multithreading,caching,C++,Multithreading,Caching,多线程会降低我的代码速度,尽管我已经注意到了这些帖子: 我想所有的预防措施都已经做好了: 我的CPU是4核+超线程(有效的是8个),我运行的线程不超过4个 每个线程处理的向量条目的数量似乎足够大(每个线程200万个)因此,任何错误共享(缓存线问题)都可以忽略不计,因为大多数数据不会与其他线程的数据重叠 条目在内存中是连续的,缓存未命中的可能性很小 使用tmp变量进行连续操作,而不是将值直接赋给数组 在发布模式下生成,VisualStudio 线程之间没有临界点(它们不使用互斥锁,也不共享数

多线程会降低我的代码速度,尽管我已经注意到了这些帖子:


我想所有的预防措施都已经做好了:

  • 我的CPU是4核+超线程(有效的是8个),我运行的线程不超过4个

  • 每个线程处理的向量条目的数量似乎足够大(每个线程200万个)因此,任何错误共享(缓存线问题)都可以忽略不计,因为大多数数据不会与其他线程的数据重叠

  • 条目在内存中是连续的,缓存未命中的可能性很小

  • 使用
    tmp
    变量进行连续操作,而不是将值直接赋给数组

  • 在发布模式下生成,VisualStudio

  • 线程之间没有临界点(它们不使用互斥锁,也不共享数据)

  • 当测量时间时,我会创建一个线程。当然,启动4个线程不会那么昂贵吗

    1个线程:大约140毫秒

    4个线程:大约155毫秒

    主要内容:

    struct MyStruct{
    双val=0;
    };
    尺寸=100e4;
    大小\u t numThreads=4;
    std::载体arr;
    void main(){
    arr.reserve(numEntries);
    
    对于(size_t i=0;i而言,以下是您的问题:

    for(size_t i=5; i<endIx-5; ++i){
               ^^^
    

    for(size\u t i=5;调用
    this\u thread::sleep\u for
    对我来说似乎很可疑。另请参见、、等。谢谢,我将检查链接!因为运行代码会产生不同的结果,我只想平均试验的持续时间。在主线程中添加
    sleep\u for
    以分散计算(以防我的电脑当时做了一些不同的事情)你刚刚让我做了facepalm。所以他们都使用了共享区域。
    //ran by each thread
    void threadWork(size_t threadId){
        size_t numPerThread = (numEntries+numThreads -1) / numThreads;
    
        size_t start_ix = threadId * numPerThread;
    
        size_t endIx;
        if (threadId == numThreads - 1) {
            endIx = numEntries-1;//we are the last thread
        }
        else {
            endIx = start_ix + numPerThread;
        }
    
        for(size_t i=5; i<endIx-5; ++i){
            double tmp = arr[i].val; 
    
            tmp += arr[i-1].val;
            tmp += arr[i-3].val;
            tmp += arr[i-4].val;
            tmp += arr[i-5].val;
            tmp += arr[i-2].val;
    
            tmp += arr[i+1].val;
            tmp += arr[i+3].val;
            tmp += arr[i+4].val;
            tmp += arr[i+5].val;
            tmp += arr[i+2].val;
    
            if(tmp > 0){ tmp *= 0.5f;}
            else{ tmp *= 0.3f; }
    
            arr[i].val = tmp;
        }
    }//end()
    
    
    //measures time
    void launchThreads(float &avgTime){
    
        using namespace std::chrono;
        typedef std::chrono::milliseconds ms;
    
        high_resolution_clock::time_point t1 = high_resolution_clock::now();
    
        std::vector<std::thread> threads;
        for (int i = 0; i <numThreads; ++i) {
            std::thread t = std::thread(threadWork, i);
            threads.push_back(std::move(t));
        }
    
        for (size_t i = 0; i < numThreads; ++i) {
            threads[i].join();
        }
        high_resolution_clock::time_point t2 = high_resolution_clock::now();
        ms timespan = duration_cast<ms>(t2 - t1);
        avgTime += timespan.count();
    }
    
    for(size_t i=5; i<endIx-5; ++i){
               ^^^
    
    for(size_t i=start_ix + 5; i<endIx-5; ++i){
               ^^^^^^^^^^^^^^