私は 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倍ではありません!!
事前にご協力いただきありがとうございます