C++ libstdc和x2B的加速性能差+;并行模式快速排序

C++ libstdc和x2B的加速性能差+;并行模式快速排序,c++,parallel-processing,quicksort,libstdc++,c++-standard-library,C++,Parallel Processing,Quicksort,Libstdc++,C++ Standard Library,通过libstdc++(并行模式)的并行实现,我无法使用就地排序算法(快速排序和平衡快速排序;QS/BQS)获得高于2的加速比。我曾尝试在由16到24个内核组成的许多不同系统上运行代码。我还尝试了GNU和英特尔C++编译器,即使在不同版本中,总是有相同的结果。2左右的加速比对于2到最大值之间的任何数量的内核都是相同的 相反,多路合并排序(MWMS)具有很好的扩展性(在16核机器上使用16个线程可以加速10个左右)。根据J.Singler的“GNU libstdc++并行模式:从使用STL的多核中

通过libstdc++(并行模式)的并行实现,我无法使用就地排序算法(快速排序和平衡快速排序;QS/BQS)获得高于2的加速比。我曾尝试在由16到24个内核组成的许多不同系统上运行代码。我还尝试了GNU和英特尔C++编译器,即使在不同版本中,总是有相同的结果。2左右的加速比对于2到最大值之间的任何数量的内核都是相同的

相反,多路合并排序(MWMS)具有很好的扩展性(在16核机器上使用16个线程可以加速10个左右)。根据J.Singler的“GNU libstdc++并行模式:从使用STL的多核中获益”的介绍,其测量的BQ加速比几乎与MWMS相同(见第18页);他们观察到使用32个线程的BQ加速超过20次


你知道为什么会发生这种情况,或者我做错了什么吗?

我似乎通过打电话解决了这个问题:

omp_set_nested(1);

文件对此要求有点不清楚。此外,我希望库能够自己执行调用。希望这也能帮助其他人。

您是否调用
omp\u set\u num\u threads()
来设置它应该使用的线程数?是的,我知道(否则,MWMS也不会有加速)。这可能很明显,但您是否检查了openmp标志?@coincoin:您是指编译器标志?是的,我有。在所有3种情况下(QS、BQS和MWMS),我都使用相同的源代码和相同的构建过程。此外,如果没有openmp标志,可能不会有加速,但我观察到加速比为2。@NathanOliver:谢谢你提醒我手册。我已经看过很多次了,但直到现在我才想到尝试调用
omp\u set\u nested()