为什么这段代码在Mac和Red Hat中的运行方式如此不同

Why this code run so differently in Mac and Red Hat

本文关键字:Hat 运行方式 Red 段代码 代码 Mac 为什么      更新时间:2023-10-16

这是使用树列表累积数组的代码的一部分。它在红帽子里跑得很慢。

我循环这个代码,8860000次
mac消耗13.6957秒
红帽子消耗50.78秒。

为什么mac在cpu较慢的情况下运行相同的代码比Red hat快得多
我列出了这两个系统的信息,有人能帮我弄清楚吗
我用来编译的命令是:g++main.cc tp.cc-O2。
编译器确实有一些不同,mac air支持浮点计算比Red hat计算机更好吗,无论如何,请帮助我。

inline bool TP::left_branch(double const& fea_val, float const& node_val) {
return fea_val <= node_val;
}   
void TP::predict(double const *features){
uint32_t i, n, k;
double* preds=predictions_;
memcpy(preds, init_preds_, sizeof(double) * class_count_);
for (i = 0; i < tree_count_; i++) {
struct Tree *tree = trees_ + i;
for (n = 0;;) {
struct Node *node = tree->root + n;
if (node->is_leaf) {
//leaf_nodes[i] = node->leaf_idx;
for (k = 0; k < class_count_; k++) {
preds[k] += node->increments[k];
}
break;
}
if (left_branch(features[node->var_idx], node->var_val)) {
n = n * 2 + 1;
} else {
n = n * 2 + 2;
}
}
}
}

Mac信息:
Mac:OS X Yosemite 10.10(14A389)
cpu:1.4 GHz Intel Core i5
编译器:配置有:--前缀=/Library/Developer/CommandLineTools/usr--带有gxx include dir=/usr/include/c++/4.2.1Apple LLVM 6.0版(clang-600.0.56)(基于LLVM 3.5svn)目标:x86_64-apple-darwin14.0.0线程型号:posix

Red Hat信息:
pc:Linux版本2.6.32-220.23.2.ali927.el5.x86_64
cpu:Intel(R)Xeon(R)cpu E5-2630 0@2.30GHz
编译:g++(GCC)4.1.2 20080704(Red Hat 4.1.2-51)

有很多可能的原因,我已经按可能性的降序列出了这些原因。

  • 非常旧的编译器/OS版本:您正在一个同样过时的Linux发行版上运行一个非常旧的g++版本(超过7年)。很有可能您只是在处理代码质量的巨大差异。您应该考虑将您的Red Hat版本(或其他发行版)更新为更现代的版本,这不仅是因为性能,还因为安全问题。

  • 内存分配器差异导致的位置性:另一个可能的原因是内存分配器(malloc)导致的位置差异。您可以在两个系统上尝试Hoard(www.Hoard.org)或另一个替代内存分配器来隔离这种影响。

  • 硬件差异:您在两个完全不同的硬件平台上运行。虽然我不怀疑这是问题所在,但您可以通过在Mac上的虚拟机中运行Linux来隔离可能的硬件影响。使用Parallels或VMware之类的具有相当高性能的东西,而不是VirtualBox,后者没有。