GotoBLAS-1.26.tar.gz compile at Intel Nehalem CPU
GotoBLAS 1.26을 회사 직원이 테스트 하신다고 컴파일을 하는데 안된다고해서 살펴봤다. 그런데 RHEL5.3에서는 컴파일이 안된다. 값을 나눌때 0값으로 값을 나누기 때문에 에러가 난다고 뜬다.
아래와 같이…
make[3]: Entering directory `/root/HPL_HOME/GotoBLAS/level1/iamax/x86_64′
gcc -c -O2 -D__64BIT__ -D_GNU_SOURCE -Wall -fPIC -m64 -DSMP_SERVER -DMAX_CPU_NUMBER=8 -DNUM_BUFFERS=\(2*8\) -DASMNAME=isamax -DASMFNAME=isamax -DNAME=isamax -DCNAME=isamax -I../../.. -DARCH_X86_64 -DINTEL_UNKNOWN -DL1_DATA_SIZE=32768 -DL1_DATA_ASSOCIATIVE=8 -DL1_DATA_LINESIZE=64 -DL2_SIZE=262144 -DL2_ASSOCIATIVE=6 -DL2_LINESIZE=64 -DITB_SIZE=4096 -DITB_ASSOCIATIVE=4 -DITB_ENTRIES=128 -DDTB_SIZE=4096 -DDTB_ASSOCIATIVE=4 -DDTB_ENTRIES=64 -DHAVE_CMOV -DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 -DHAVE_SSSE3 -DHAVE_SSE4_1 -DHAVE_SSE4_2 -DHAVE_CFLUSH -DNUM_SHAREDCACHE=1 -DNUM_CORES=1 -UDOUBLE -DF_INTERFACE -DABS iamax_sse.S -o ../isamax.o
In file included from ../../../common.h:201,
from iamax_sse.S:23:
../../../param.h:1195:21: error: In file included from ../../../common.h:201,
from iamax_sse.S:23:
../../../param.h:1195:21: error: division by zero in #if
../../../param.h:1195:21: error: division by zero in #if
../../../param.h:1205:21: error: division by zero in #if
../../../param.h:1205:21: error: division by zero in #if
division by zero in #if../../../param.h:1225:21: error: division by zero in #if
../../../param.h:1225:21: error: division by zero in #if
../../../param.h:1235:21: error: division by zero in #if
../../../param.h:1235:21: error: division by zero in #if
../../../param.h:1195:21: error: division by zero in #if
../../../param.h:1205:21: error: division by zero in #if
../../../param.h:1205:21: error: division by zero in #if
../../../param.h:1225:21: error: division by zero in #if
../../../param.h:1225:21: error: division by zero in #if
../../../param.h:1235:21: error: division by zero in #if
../../../param.h:1235:21: error: division by zero in #if
make[3]: *** [../isamax.o] Error 1
make[3]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1/iamax/x86_64′
make[2]: *** [isamax.o] Error 2
make[2]: *** Waiting for unfinished jobs….
make[3]: *** [../isamax_k.o] Error 1
make[3]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1/iamax/x86_64′
make[2]: *** [isamax_k.o] Error 2
make[2]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1/iamax’
make[1]: *** [libs] Error 1
make[1]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1′
make: *** [libs] Error 1
Abort!!
이것을 다시 내 노트북에서 컴파일을 해봤다. 내 노트북에서는 된다. 그래서 OS에서 지원이 안되는줄 알았다. 처음에는 OS가 서로 틀려서…. 그런데 같은 OS로 테스트를 해봐도 마찬가지로 같은 Error가 난다. 이것은 OS문제가 아닌 Hardware 문제이다.
두 컴파일 옵션을 비교해봤다. 서로 하드웨어가 틀려서 일부 틀려지는 값들이 있다. 이 값들중에 어떤것이 과연 문제를 일으킬가 고민하다 하나를 선택했다. 바로 CPU Type을….
대부분 CPU Type이 틀리면 알아서 적당히 default값으로 넘어가 컴파일 되게 되는데 이번에는 아니었다. CPU에 대한 정확한 값을 몰라 나누기를 못했나보다.
이것에 대해 설펴보니 cpuid_x86.c 코드에서 문제가 발생됬다.
그래서 그냥 뜻어 고쳤다. ㅎㅎ 일단 가장 유사해보이는 core2로 바꿨다.
783 line에서 “return CPUTYPE_INTEL_UNKNOWN;”을 주석처리하고 CORE2로 바꿨다.
아래와 같이… 그랬더니 컴파일이 잘된다.
}
return CPUTYPE_CORE2;
/* return CPUTYPE_INTEL_UNKNOWN; */
}
그런데 한가지 문제가 더 있다.
make[3]: Entering directory `/root/HPL_HOME/GotoBLAS/level1/axpy/x86_64′
gcc -c -O2 -D__64BIT__ -D_GNU_SOURCE -Wall -fPIC -m64 -DF_INTERFACE_GFORT -DPACKED_RETURN -DMAX_CPU_NUMBER=8 -DNUM_BUFFERS=\(2*8\) -DEXPRECISION -m128bit-long-double -DASMNAME=saxpy_k -DASMFNAME=saxpy_k_ -DNAME=saxpy_k_ -DCNAME=saxpy_k -DBUNDERSCORE=_ -DNEEDBUNDERSCORE -I../../.. -DARCH_X86_64 -DCORE2 -DL1_DATA_SIZE=32768 -DL1_DATA_ASSOCIATIVE=8 -DL1_DATA_LINESIZE=64 -DL2_SIZE=262144 -DL2_ASSOCIATIVE=6 -DL2_LINESIZE=64 -DITB_SIZE=4096 -DITB_ASSOCIATIVE=4 -DITB_ENTRIES=128 -DDTB_SIZE=4096 -DDTB_ASSOCIATIVE=4 -DDTB_ENTRIES=64 -DHAVE_CMOV -DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 -DHAVE_SSSE3 -DHAVE_SSE4_1 -DHAVE_SSE4_2 -DHAVE_CFLUSH -DNUM_SHAREDCACHE=1 -DNUM_CORES=1 -UDOUBLE -o ../saxpy_k.o
gcc: no input files
make[3]: *** [../saxpy_k.o] Error 1
make[3]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1/axpy/x86_64′
make[2]: *** [saxpy_k.o] Error 2
make[2]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1/axpy’
make[1]: *** [libs] Error 1
make[1]: Leaving directory `/root/HPL_HOME/GotoBLAS/level1′
make: *** [libs] Error 1
이렇게 에러가 난다. 이것은 Makefile 문제인듯하다. 이것은 아래처럼 컴파일 옵션을 바꿔주면 잘 컴파일 된다. 여기서 각 에러나는 디렉토리에서 “../../amax/x86_64/amax.S” 소스 파일 이 들어가지 않고 컴파일 되서 그렇다. 에러나는것은 아래처럼 “../../amax/x86_64/amax.S”을 넣어주고 컴파일을 하나하나 해줘도 된다. ( `/root/HPL_HOME/GotoBLAS/level1/axpy/x86_64′ 디렉토리만 문제인가보다. 여기 Makefile을 살펴봐야 되나? )
gcc -c -O2 -D__64BIT__ -D_GNU_SOURCE -Wall -fPIC -m64 -DF_INTERFACE_GFORT -DPACKED_RETURN -DMAX_CPU_NUMBER=8 -DNUM_BUFFERS=\(2*8\) -DEXPRECISION -m128bit-long-double -DASMNAME=saxpy_k -DASMFNAME=saxpy_k_ -DNAME=saxpy_k_ -DCNAME=saxpy_k -DBUNDERSCORE=_ -DNEEDBUNDERSCORE -I../../.. -DARCH_X86_64 -DCORE2 -DL1_DATA_SIZE=32768 -DL1_DATA_ASSOCIATIVE=8 -DL1_DATA_LINESIZE=64 -DL2_SIZE=262144 -DL2_ASSOCIATIVE=6 -DL2_LINESIZE=64 -DITB_SIZE=4096 -DITB_ASSOCIATIVE=4 -DITB_ENTRIES=128 -DDTB_SIZE=4096 -DDTB_ASSOCIATIVE=4 -DDTB_ENTRIES=64 -DHAVE_CMOV -DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 -DHAVE_SSSE3 -DHAVE_SSE4_1 -DHAVE_SSE4_2 -DHAVE_CFLUSH -DNUM_SHAREDCACHE=1 -DNUM_CORES=1 -UDOUBLE ../../amax/x86_64/amax.S -o ../saxpy_k.o
이것은 에러나는 디렉토리에 들어가서 Makefile 을 열어서 아래처럼 수정해준다.
ifeq ($(CORE), CORE2)
SDOTKERNEL = dot_sse_core2.S
DDOTKERNEL = dot_sse2_core2.S
CDOTKERNEL = zdot_sse.S
ZDOTKERNEL = zdot_sse2_core2.S
endif
을 아래처럼 수정한다. 아마도 어딘가에서 CORE2란 정보를 정상적으로 전달하지 못해서 생기는 증상같다. 이렇게 해주면 CORE2로 컴파일 잘된다.
#ifeq ($(CORE), CORE2)
SDOTKERNEL = dot_sse_core2.S
DDOTKERNEL = dot_sse2_core2.S
CDOTKERNEL = zdot_sse.S
ZDOTKERNEL = zdot_sse2_core2.S
#endif