我正在开发一个 C/C++ 应用程序以通用方式(聚合/选择/转换)操作大量数据。我使用的是 AMD Phenom II X4 965 Black Edition,因此具有相当数量的不同缓存。
我开发了 ST 和 MT 版本的函数来执行所有单个操作,毫不奇怪,在最好的情况下,即使使用4核,MT 版本也比 ST 快 2 倍。
鉴于我喜欢使用 100% 的可用资源,我很生气只有 2 倍,我想要 4 倍。出于这个原因,我已经使用缓存模拟器和调用图在-pg和valgrind
上花费了相当多的时间。程序按预期工作,核心共享输入过程数据(即应用于数据的操作),当不同线程加载要处理的数据(数百万个实体或行)时报告缓存未命中(如预期的那样)如果现在您知道我要做什么:-))。最终,我使用了不同的编译器,g++ 和 clang++,两者都带有-O3,并且性能是相同的。
我的结论是,由于要处理大量数据(GB 数据),鉴于数据最终必须加载到 CPU 中,这是真正的等待时间。我可以进一步改进我的软件吗?我达到极限了吗?
我在 Linux x86-64、Ubuntu 11.10 上使用 C/C++。我全是耳朵!:-)