클러스터 테스트를 위해 OS를 설치되는 10여분동안 잠시 사진 정리해 올려본다.
얼마전 2009 SEG Show를 huston에서 했었다.
설치할때 가서 좀 도와주고 끝나는날 잠시 가서 둘러볼수 있었다.
SEG Show는 처음 와봤는데 그리 크지도 않고 사람이 그리 많지도 않고 슈퍼컴이 목적이 아닌것 같다. 슈퍼컴 관련 업체는 우리를 포함해 약 4개업체정도 왔고 그외 주변 부품 업체는 2~3개 업체가 온것 같다. 그외 업체들은 모두 공학 및 과학 과련 업체라 해야할지 암튼 그런류가 대부분이었다. 이번에는 슈퍼컴 업체들도 작게 부스를 만들어 약간 소개하는정도로 끝낸것 같아보인다.
아니면 경기 침체가 커서 슈퍼컴 관련 업체에 타격이 커서 그런가? 오히려 공학 쪽 업체가 부스가 무치 큰 업체가 많았다.
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