-1

我用 C 编写了科学代码。我在 Ubuntu 中使用 gcc 4.7.2 编译代码,在 MBP 中使用 gcc 4.2 编译代码。我的 Makefile 看起来像这样:

CC = gcc
CFLAGS = -c -fPIC -Wall -O3 -lpthread -g
BaseDir = /Users/admin/
libName = libTTVS.so
Include = -I$(BaseDir)UMFPACK/Include -I$(BaseDir)AMD/Include -I$(BaseDir)SuiteSparse_config
Lib = -L$(BaseDir)UMFPACK/Lib -L$(BaseDir)AMD/Lib -L$(BaseDir)SuiteSparse_config -L$(BaseDir)GotoBLAS2
AddFiles = -lumfpack -lamd -lsuitesparseconfig -lgoto2
StaticLibs = $(BaseDir)UMFPACK/Lib/libumfpack.a $(BaseDir)AMD/Lib/libamd.a $(BaseDir)SuiteSparse_config/libsuitesparseconfig.a $(BaseDir)GotoBLAS2/libgoto2.a
all: AlgebraFuncs.o QSP.o UpdateAlgVars.o AlgVarsJac.o ExtraRoutines.o SolveMultiStepSolverC.o TTVS.o TTVS.h
        $(CC) $(Include) $(Lib) $(AddFiles) -shared -lpthread -o $(libName) $^ -lm -g $(StaticLibs)

AlgebraFuncs.o: AlgebraFuncs.c TTVS.h
        $(CC) $(Include) $(CFLAGS) $^

QSP.o: QSP.c TTVS.h
        $(CC) $(Include) $(CFLAGS) $^

UpdateAlgVars.o: UpdateAlgVars.c TTVS.h
        $(CC) $(Include) $(CFLAGS) $^

AlgVarsJac.o: AlgVarsJac.c TTVS.h
        $(CC) $(CFLAGS) $^

ExtraRoutines.o: ExtraRoutines.c TTVS.h
        $(CC) $(CFLAGS) $^

SolveMultiStepSolverC.o: SolveMultiStepSolverC.c TTVS.h
        $(CC) $(Include) $(CFLAGS) $^

TTVS.o: TTVS.c TTVS.h
        $(CC) $(Include) $(CFLAGS) $^

如您所见,我使用 -O3 来编译源代码。

问题是编译后的代码在 Mac 中非常慢。在 Ubuntu 中,代码在 0.89 秒内执行,而在 MBP 中,需要 7.8 秒。我还在 MATLAB 中实现了代码,结果如下:Ubuntu:4 秒,MBP:5.5 秒。如您所见,C 代码的运行速度甚至比 MATLAB 还要慢,这是没有意义的。虽然 gcc 版本在两个平台上并不相同,但我希望它们至少接近。我的主要问题是我什至不知道从哪里开始解决问题或我应该检查什么。

这是两台机器的规格: Ubuntu:Core i7 2600 @3.4GHz,四核,8GB Ram MBP:Core i5 @2.5GHz,8GB Ram

我知道 Ubuntu 具有更强大的 CPU,但考虑到 MATLAB 的结果,我不明白为什么 C 代码在 Ubuntu 中要快得多。它应该更快,但不是 8 倍!

提前感谢您的帮助

4

1 回答 1

3

您使用的旧编译器对 CPU 支持的指令没有优化支持。尝试改用 Clang,Apple 前段时间停止支持 GCC,并在新版本的 Xcode 中切换到此编译器。

于 2013-04-20T06:46:26.377 回答