Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++_Multithreading_Performance - Fatal编程技术网

C++ 对于完全相同的函数,单线程代码比串行代码慢得多

C++ 对于完全相同的函数,单线程代码比串行代码慢得多,c++,multithreading,performance,C++,Multithreading,Performance,因此,我尝试使用windows线程执行一些多线程。我面临的问题是,在串行情况下,完全相同的函数调用要比单线程情况快得多(7倍!)。当我研究这是否是由于缓存利用率问题时,我在任务管理器中看到了一些快速数字。在串行情况下,使用的非分页内核内存为2793MB。在单线程情况下,该数字上升到~3100MB。我的怀疑是,在单线程的情况下,生成的线程位于另一个处理器上,所有额外的时间都用于将数据移动到线程的内存中。我的问题有两个: 我不知道任务管理器上显示的非分页内核内存使用情况是什么意思,但考虑到所描述的行

因此,我尝试使用windows线程执行一些多线程。我面临的问题是,在串行情况下,完全相同的函数调用要比单线程情况快得多(7倍!)。当我研究这是否是由于缓存利用率问题时,我在任务管理器中看到了一些快速数字。在串行情况下,使用的非分页内核内存为2793MB。在单线程情况下,该数字上升到~3100MB。我的怀疑是,在单线程的情况下,生成的线程位于另一个处理器上,所有额外的时间都用于将数据移动到线程的内存中。我的问题有两个:

  • 我不知道任务管理器上显示的非分页内核内存使用情况是什么意思,但考虑到所描述的行为,它是否支持我的怀疑?是否有更好的方法来测量windows上的缓存未命中(希望Valgrind在windows上工作:/)

  • 如果不是,还有什么会导致此问题?函数的代码路径完全相同。该函数的结果完全相同,内部没有关键节/互斥体或堆内存分配。这把我难住了

  • 我无法显示任何实质性的源代码,但代码路径如下:

    FunctionBeingProfiled() {
        point* p1 = globalPointArray[0];
        point* p2 = globalPointArray[1];
        point* p3 = globalPointArray[2];
    
        if (PointsAreProtected(p1, p2, p3)) {
              return false;
        }
    
        linesegment lseg(p1, p2);
    
        // The following 2 calls read from global data structures populated before this call is first encountered
    
        tetrahedron tet = FindFirstTet(&lseg); // Reads from a hash table
    
        EdgeIntersectionTest(&lseg); // Basically takes the given lseg and finds all the intersections from a global vector of line segments
    
        DoVolumeTest(&lseg, &tet); // uses only the passed in lseg and tet
    
        DoShapeTest(&lseg, &tet); // uses only the passed in lseg and tet
    }
    
    FuncA() {
    
    if (serial) FunctionBeingProfiled();
    
    if (parallel) {
        _beginthreadex(..); // This calls FunctionBeingProfiled
    }
    
    }
    

    你应该展示真实的代码。我们无法调试假想的代码。正在编写更为实质性的代码“串行代码”到底是什么?所有代码都在一个线程上运行,默认情况下,您的程序只有一个线程。串行代码的意思是我不启动任何线程。只有一个进程执行代码。在1线程代码中,我使用_beginthreadex从父进程启动一个线程,然后调用FunctionBeingProfiled()。我首先测试单线程性能的原因是,当我使用多线程时,性能更差。对于仍然对此感兴趣的任何人,我有一些新的信息。我强制整个应用程序只使用1个CPU。这将减速从7倍减少到3倍。看来这是个缓存问题。我还没有弄清楚为什么三次减速仍在发生