Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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++_C_Multithreading - Fatal编程技术网

C++ 如何优化并行的大数据操作

C++ 如何优化并行的大数据操作,c++,c,multithreading,C++,C,Multithreading,我正在开发一个C/C++应用程序,以通用方式(聚合/选择/转换)处理大量数据。 我使用的是AMD Phenom II X4 965黑色版,因此具有相当数量的不同缓存 我开发了ST和MT版本的函数来执行所有单个操作,毫不奇怪,在最好的情况下,MT版本比ST快2倍,即使使用4个内核 考虑到我是一个使用100%可用资源的粉丝,我很恼火,因为只有2倍,我想要4倍。 出于这个原因,我已经花了相当多的时间使用-pg和valgrind,使用缓存模拟器和调用图。当不同的线程加载要处理的数据时(如果您现在知道我正

我正在开发一个C/C++应用程序,以通用方式(聚合/选择/转换)处理大量数据。 我使用的是AMD Phenom II X4 965黑色版,因此具有相当数量的不同缓存

我开发了ST和MT版本的函数来执行所有单个操作,毫不奇怪,在最好的情况下,MT版本比ST快2倍,即使使用4个内核

考虑到我是一个使用100%可用资源的粉丝,我很恼火,因为只有2倍,我想要4倍。
出于这个原因,我已经花了相当多的时间使用-pg和valgrind,使用缓存模拟器和调用图。当不同的线程加载要处理的数据时(如果您现在知道我正在尝试做什么的话,数百万个实体或行),程序正在按预期工作,内核正在共享输入的进程数据(即应用于数据的操作),并报告缓存未命中(如预期的那样)。 最后,我使用了不同的编译器,g++和clang++,都使用了-O3,并且性能是相同的

我的结论是,由于要处理的数据量很大(GB数据),考虑到数据最终必须在CPU中加载,这是实时等待时间。 我可以进一步改进我的软件吗?我达到极限了吗

我在Linux x86-64和Ubuntu 11.10上使用C/C++。
我洗耳恭听!:-)

它是什么类型的应用程序?你能给我们看一些代码吗

正如我所评论的,您可能已经达到了一些硬件限制,比如RAM带宽。如果你做到了,没有任何软件技巧可以改善它

您可能会研究使用MPI、OpenMP或OpenCL(在GPU上),但如果不了解您的应用程序,我们将无能为力


如果用GCC编译,如果你想帮助处理器缓存预取,考虑使用谨慎和吝啬(但是使用它太多或太坏会降低性能)。也许你正在碰到一些硬件限制,比如RAM带宽。你确定你的平台能够提供4X吗?你有没有写过比单线程性能高4倍的算法?是所有的内核都以50%的占空比运行,还是有2个100%和2个空闲?硬件预读启动了吗?这就是我所希望的,硬件预读。我如何验证是否/何时发生这种情况?但我恐怕已经做到了。我恐怕已经达到了我个人硬件的极限。该应用程序是一个内存中的关系数据库原型,面向性能和并行。一旦我澄清了这个“问题”,我将在GPL下发布源代码。我过去一直在使用MPI和OpenCL,但在这种情况下,CPU本身并不是我认为的瓶颈,所以我认为GPU不会如此有益。自由软件更明智的理念是在开发过程中展示它(早期发布,经常发布的座右铭),而它仍然是alpha和不完整的,为了得到有用的评论或贡献。。。发布有问题的代码可以为您提供一些帮助!。我试过在这里和那里进行一些预加载,但不幸的是,似乎没有达到预期的效果。我会再试一次,但是看起来我已经达到了硬件的极限。。。也许这就是为什么服务器专业人士会购买速度较慢但缓存更多的CPU?我还建议尝试使用MPI(您可以在Linux上使用OpenMPI),即使您只处理一台机器。与线程相比,它更容易编码(主要是因为没有共享内存),所以值得一试。