-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
$
이것은 컴파일러의 정상적인 동작입니까, 아니면 실수를하고 있습니까?
코드는 무엇입니까? 어쩌면 너무 간단할까요? –
재 컴파일을 시도 했습니까? 디버깅에서 프로파일 컴파일로 변경했을 때 소스 파일을 컴파일 할 때 makefile/compilerflags가 변경되지 않고 소스 파일을 다시 컴파일해야하는지 결정할 때 문제가 있다는 것을 알고 있습니다. –
@KirilKirov 코드는 상당히 복잡합니다. 유체 이류, 확산, 투영을 수행하는 CUDA 안정적인 유체 시뮬레이션의 CPU 포트입니다. OpenGL을 사용하여 입자가 캔버스에서 움직이는 방식을 표시합니다. 수학적 배경은 http://http.developer.nvidia.com/GPUGems/gpugems_ch38.html에서 읽을 수 있습니다. –