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