【发布时间】:2015-10-30 19:34:42
【问题描述】:
我正在尝试编译一个大型 C 文件(专门用于 MATLAB 混合)。 C 文件大小约为 20 MB(如果您想使用它,可以使用 from the GCC bug tracker)。
下面是我正在运行的命令和屏幕的输出。这已经运行了几个小时,如您所见,优化已被禁用(-O0)。为什么这么慢?有什么方法可以让这更快吗?
(供参考:Ubuntu 12.04(Precise Pangolin)64 位和 GCC 4.7.3)
/usr/bin/gcc -c -DMX_COMPAT_32 -D_GNU_SOURCE -DMATLAB_MEX_FILE -I"/usr/local/MATLAB/R2015a/extern/include" -I"/usr/local/MATLAB/R2015a/simulink/include" -ansi -fexceptions -fPIC -fno-omit-frame-pointer -pthread -O0 -DNDEBUG path/to/test4.c -o /tmp/mex_198714460457975_3922/test4.o -v
Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.3-2ubuntu1~12.04' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --with-system-zlib --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04)
COLLECT_GCC_OPTIONS='-c' '-D' 'MX_COMPAT_32' '-D' '_GNU_SOURCE' '-D' 'MATLAB_MEX_FILE' '-I' '/usr/local/MATLAB/R2015a/extern/include' '-I' '/usr/local/MATLAB/R2015a/simulink/include' '-ansi' '-fexceptions' '-fPIC' '-fno-omit-frame-pointer' '-pthread' '-O0' '-D' 'NDEBUG' '-o' '/tmp/mex_198714460457975_3922/test4.o' '-v' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -quiet -v -I /usr/local/MATLAB/R2015a/extern/include -I /usr/local/MATLAB/R2015a/simulink/include -imultilib . -imultiarch x86_64-linux-gnu -D_REENTRANT -D MX_COMPAT_32 -D _GNU_SOURCE -D MATLAB_MEX_FILE -D NDEBUG path/to/test4.c -quiet -dumpbase test4.c -mtune=generic -march=x86-64 -auxbase-strip /tmp/mex_198714460457975_3922/test4.o -O0 -ansi -version -fexceptions -fPIC -fno-omit-frame-pointer -fstack-protector -o /tmp/ccxDOA5f.s
GNU C (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04) version 4.7.3 (x86_64-linux-gnu)
compiled by GNU C version 4.7.3, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/MATLAB/R2015a/extern/include
/usr/local/MATLAB/R2015a/simulink/include
/usr/lib/gcc/x86_64-linux-gnu/4.7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
GNU C (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04) version 4.7.3 (x86_64-linux-gnu)
compiled by GNU C version 4.7.3, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c119948b394d79ea05b6b3986ab084cf
编辑:后续:我遵循 chqrlie 的建议,tcc 在
但是,当尝试对其进行 mex 时,mex 通常需要另一个命令。第二个命令通常是:
/usr/bin/gcc -pthread -Wl,--no-undefined -Wl,-rpath-link,/usr/local/MATLAB/R2015a/bin/glnxa64 -shared -O -Wl,--version-script,"/usr/local/MATLAB/R2015a/extern/lib/glnxa64/mexFunction.map" /tmp/mex_61853296369424_4031/test4.o -L"/usr/local/MATLAB/R2015a/bin/glnxa64" -lmx -lmex -lmat -lm -lstdc++ -o test4.mexa64
我不能用 tcc 运行它,因为其中一些标志不兼容。如果我尝试使用 GCC 运行第二个编译步骤,我会得到:
/usr/bin/ld: test4.o: relocation R_X86_64_PC32 against undefined symbol `mxGetPr' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
编辑:解决方案似乎是铿锵声。 tcc可以编译文件,但是mexing第二步的参数和tcc的参数选项不兼容。 Clang 速度非常快,可以生成一个漂亮、小巧、优化的文件。
【问题讨论】:
-
这个C代码真的很奇怪。你能考虑生成不同的 C 吗?
-
@user650261 我不会为了回答 Stack Overflow 上的问题而购买 2000 美元的软件包。如果你需要帮助,约定是做一个独立的例子。您的代码不是独立的,因为它需要专有的
mex.h标头。 20 MiB C 表达式绝对是奇怪的。也许可以用不同的方式表达相同的概念,例如作为一个从数组中提取参数的循环。 -
@user650261 请引用您的“大公司编译大文件”的来源。我敢打赌,他们将它们分成更小的可管理模块,因为它们肯定知道“获得的智慧”。
-
我不会从外部且可能不为人知的来源下载源代码。但是,我第二次选择 FUZxxl 和 WeatherVane。如此大的文件绝对不正常,不仅要维护,还要编辑和(可能)调试。 @FUZxxl 的评论显然是有道理的,而不是你告诉他闭嘴的。是 你 寻求帮助,显然文件大小有问题。尝试将其分解为更小的单位。
-
好的,我认为文件的大小是这里固有的问题,其他人可能也有类似的问题,所以我重新打开了这个。但是,我担心链接文件会在未来某个时候消失,从而使问题变得不那么有用。这就是为什么我们倾向于建议人们尽量减少问题并将其放在问题本身中。这是一个有点极端的情况。我只要求每个人都保持他们的 cmets 文明和主题。