2017-01-18 8 views
2

-O0, -O1, -O2-O3에 대해 동일한 최적화 프로그램을 컴파일했습니다. 나는 gcc와 icc를 모두 사용했다. 아래에서 make 파일의 일부를 볼 수 있습니다 :최적화 플래그를 증가시킬 때 바이너리가 변경되지 않는 이유는 무엇입니까?

build-gcc-O3: CXX = g++ 
build-gcc-O3: BIN_POST_NAME = -gcc-O3 
build-gcc-O3: OPT_FLAGS = -O3 
build-gcc-O3: fluidsGL 

build-icc-O0: CXX = $(INTEL_ICPC) 
build-icc-O0: BIN_POST_NAME = -icc-O0 
build-icc-O0: OPT_FLAGS = -O0 
build-icc-O0: fluidsGL 

fluidsGL: fluidsGL.o fluidsGL_cpu.o bilinear_interpolation.o defines.o 
    $(CXX) $(CXXFLAGS) $(BINARY_DIR)/defines.o $(BINARY_DIR)/bilinear_interpolation.o $(BINARY_DIR)/fluidsGL_cpu.o $(BINARY_DIR)/fluidsGL.o -o $(BINARY_DIR)/[email protected]$(BIN_POST_NAME)$(DBG_NAME_APPEND) $(OPT_FLAGS) -lGL -lGLU -lGLEW -lglut -lfftw3f 

make를 실행하면 출력이 정상적으로 보입니다. 예를 들어,이 -O3와 ICC 용 메이크 생성 된 명령은 다음

"/opt/intel/compilers_and_libraries/linux/bin/intel64/icpc" -Wall bin/defines.o bin/bilinear_interpolation.o bin/fluidsGL_cpu.o bin/fluidsGL.o -o bin/fluidsGL-icc-O3 -O3 -lGL -lGLU -lGLEW -lglut -lfftw3f 

(fluidsGL-ICC-O3 VS 및 fluidsGL-ICC-O0) fluidsGL-GCC-O0 및 fluidsGL-GCC-O3 바이너리 컴파일 한 후 같은 디스크 공간이 필요합니다,이 이미 나를 위해 이상한 것 같다

$ ls -la bin/ 
total 728 
drwxrwxr-x 3 jesus jesus 4096 ene 18 09:56 . 
drwxrwxr-x 7 jesus jesus 4096 ene 18 09:31 .. 
-rw-rw-r-- 1 jesus jesus 4200 ene 18 09:56 bilinear_interpolation.o 
-rw-rw-r-- 1 jesus jesus 5608 ene 18 09:56 defines.o 
-rw-rw-r-- 1 jesus jesus 14952 ene 18 09:56 fluidsGL_cpu.o 
-rwxrwxr-x 1 jesus jesus 30780 ene 18 09:56 fluidsGL-gcc-O0 
-rwxrwxr-x 1 jesus jesus 43940 ene 18 09:56 fluidsGL-gcc-O0-dbg 
-rwxrwxr-x 1 jesus jesus 44272 ene 18 09:56 fluidsGL-gcc-O0-dbg-gprof 
-rwxrwxr-x 1 jesus jesus 30780 ene 18 09:56 fluidsGL-gcc-O1 
-rwxrwxr-x 1 jesus jesus 30780 ene 18 09:56 fluidsGL-gcc-O2 
-rwxrwxr-x 1 jesus jesus 30780 ene 18 09:56 fluidsGL-gcc-O3 
-rwxrwxr-x 1 jesus jesus 71151 ene 18 09:56 fluidsGL-icc-O0 
-rwxrwxr-x 1 jesus jesus 71151 ene 18 09:56 fluidsGL-icc-O1 
-rwxrwxr-x 1 jesus jesus 71151 ene 18 09:56 fluidsGL-icc-O2 
-rwxrwxr-x 1 jesus jesus 71151 ene 18 09:56 fluidsGL-icc-O3 
-rw-rw-r-- 1 jesus jesus 34664 ene 18 09:56 fluidsGL.o 

을하지만 바이너리는 똑같은 바이너리에도 의미, 더 출력이 표시되지 않는 파일을 비교하는 DIFF 사용 후 :

$ diff bin/fluidsGL-gcc-O0 bin/fluidsGL-gcc-O3 
$ diff bin/fluidsGL-icc-O0 bin/fluidsGL-icc-O3 
$ 

이것은 컴파일러의 정상적인 동작입니까, 아니면 실수를하고 있습니까?

+1

코드는 무엇입니까? 어쩌면 너무 간단할까요? –

+3

재 컴파일을 시도 했습니까? 디버깅에서 프로파일 컴파일로 변경했을 때 소스 파일을 컴파일 할 때 makefile/compilerflags가 변경되지 않고 소스 파일을 다시 컴파일해야하는지 결정할 때 문제가 있다는 것을 알고 있습니다. –

+0

@KirilKirov 코드는 상당히 복잡합니다. 유체 이류, 확산, 투영을 수행하는 CUDA 안정적인 유체 시뮬레이션의 CPU 포트입니다. OpenGL을 사용하여 입자가 캔버스에서 움직이는 방식을 표시합니다. 수학적 배경은 http://http.developer.nvidia.com/GPUGems/gpugems_ch38.html에서 읽을 수 있습니다. –

답변

5

-Ox 플래그 (여기서 x은 최적화 레벨 임)는 컴파일러 최적화를위한 것이지만 실제로 다시 컴파일하지는 않습니다. 이미 컴파일 된 객체 파일 (.o) 만 다시 연결하면됩니다.

개체 파일의 컴파일 명령에 -Ox 플래그를 추가하고 완전 클린 재 작성을 수행해야합니다.

3

빌드 실수 일 가능성이 큽니다. 그렇지 않으면 makefile이 재 작성을하기를 기대합니다.

다른 최적화 설정을 사용하여 빌드 된 경우에도 일반적으로 개체 파일을 함께 연결할 수 있습니다. 따라서 make은 일반적으로 최적화 설정 변경을 지정했기 때문에 단순히 개체 파일을 삭제하거나 다시 작성하지 않습니다.

빌드 진행 상황을 보면 두 번째 빌드가 다시 컴파일되거나 다시 연결되지 않는 것을 볼 수 있습니다.

makefile에서 clean 타겟과 비슷한 것을 설정하면 컴파일 된 객체 (* .o)와 실행 파일이 제거됩니다. 그리고 비교할 두 빌드 사이에 make clean을 수행하십시오 (물론 실행 파일을 유지 한 후, 그렇지 않으면 비교할 수 없습니다).

코드가 너무 간단하여 최적화 설정을 변경해도 도움이되지 않을 수도 있습니다. 그러나 나는 그것을 의심한다.