如何并行优化大数据操作

时间:2012-07-28 09:32:10

标签: c++ c multithreading

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

我已经开发了ST和MT版本的功能来执行所有单一操作,毫不奇怪,在最好的情况下,MT版本比ST快2倍,即使使用 4 核心。

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

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

我在Linux x86-64,Ubuntu 11.10上使用C / C ++。 我全都耳朵! :-)

1 个答案:

答案 0 :(得分:1)

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

正如我评论的那样,您可能已达到一些硬件限制,如RAM带宽。如果你这样做,没有软件技巧可以改善它。

您可以使用MPI,OpenMP或OpenCL(在GPU上)进行调查,但如果不了解您的应用程序,我们将无法提供帮助。

如果使用GCC进行编译,并且如果您想帮助处理器缓存预取,请考虑谨慎使用并使用简约__builtin_prefetch(但使用它太多或太糟糕都会降低性能)。