-1

私は C で科学的なコードを書きました。gcc 4.7.2 を使用して Ubuntu でコードをコンパイルし、gcc 4.2 を使用して MBP でコードをコンパイルします。私の 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 のバージョンは 2 つのプラットフォームで同じではありませんが、少なくとも近いと思います。私の主な問題は、問題を回避するためにどこから始めればよいか、何をチェックすべきかさえわからないことです。

ここでは、2 台のマシンの仕様を示します。 Ubuntu: Core i7 2600 @3.4GHz、クアッドコア、8GB RAM MBP: Core i5 @2.5GHz、8GB RAM

Ubuntu の方がより強力な CPU を備えていることは知っていますが、MATLAB の結果を考慮すると、Ubuntu で C コードがはるかに高速である理由がわかりません。速いはずですが、8倍ではありません!!

事前にご協力いただきありがとうございます

4

1 に答える 1

3

CPU がサポートする命令の最適化をサポートしていない古いコンパイラを使用しています。代わりに Clang を使用してみてください。Apple はしばらく前に GCC のサポートを停止し、Xcode の新しいバージョンでこのコンパイラに切り替えました。

于 2013-04-20T06:46:26.377 に答える