티스토리 뷰

Study/Linux

[Linux] floating point 관련 삽질중

생각많은 소심남 2016. 5. 25. 00:51

내가 속한 파트에서 하는 일중에는 Linux를 새로 만든 보드에 porting하는 작업도 한다.
그러고보면 참 이 부서에 속하게 된것도 운이 참 좋은거 같다. 회사에서 배우는게 참 많아서 회사를 가도 뭔가 지루하지가 않다.
물론 하는 일이 잘 안되면 또 다른 이야기이겠지만...

 아무튼 우리 파트의 정말 멋지신 분이 Cortex A7 기반에서 돌아가는 Linux를 porting했다. 내가 할일은 이제 그위에서 돌아가는 benchmark tool을 조사하고 실제 돌아가게 하는 것이다. 이와중에 몇가지 안 사실을 좀 정리해보고자 한다.

 - benchmark의 핵심은 floating point 연산이다. linux에 돌아가는 lmbench나 coremark 같은 경우 대부분의 scenario가 floating point arithmetic에 걸리는 시간을 측정하고 이를 바탕으로 performance를 측정한다. 물론 architecture의 performance만 측정할 수 있는 것이 아니라  cache performance를 측정할수도 있는데, 거의 대부분 floating point가 되어야 한다.

 - 내가 처음 접한 문제는 바로 floating point가 안될 때 이 benchmark가 어떻게 수행되어야 하냐는 점이다. 마침 우리가 target으로 만들고 있는 architecture는 armv7 계열인데, floating point unit이 없다. 이때문에 arm 자체에서 fpu 연산시 지원하는 NEON instruction 같은 걸 전혀 못쓴다. 아무튼 지금 언급한 것이 hardware 자체에서 floating point를 지원하는 hard-float 모드이다. 반면 이런 fpu가 없는 상황이라면 외부의 floating point library나 emulation 기법을 사용해서 floating point 연산을 해야 한다. 이같은 방법을 soft-float 모드라고 한다.

 - 현재 내가 쓰고 있는, 혹은 내가 포팅하고자 하는 보드에서 floating point가 지원하는지 여부를 살펴보려면 다음 명령어를 사용하면 된다.

calc=$(echo 2.3 4.6 | awk '{ printf "%f", $1 + $2 }')
$ echo $calc


위의 명령을 terminal 상에서 수행하면 2.3과 4.6의 합을 출력해주는데, 정상적으로 수행된다면

이렇게 뜰 것이고, architecture에서 지원을 해주지 않는 경우라면 SIGILL(illegal instruction) exception이 발생할 것이다. 내가 직면한 문제는 우선 이거였다.


아무튼 지금 돌고 돌아 이런 문제가 linux 내에 있는 glibc에서 floating point 연산을 지원하지 못하는게 아닐까 싶어, glibc까지 다시 build하는 상황까지 왔다. 아니 그런데 glibc 빌드하는데도 삽질을 너무 많이 했다.

- 현재 회사내의 build서버에 설치되어 있는 ubuntu는 12.04 LTS이다. 여기서 repository 사이트도 업데이트가 안되어 최신 버전을 받을 수 없다.

- 결국 cross compile을 위해 arm-linux-gnueabi toolchain을 설치했는데 설치된 gcc가 4.7 대 버전이었다.

- 그런데 이 gcc로 glibc를 build하면 백이면 백 build가 error가 난다. 이유는 gcc 4.7대에 bug가 있어서 였다고...(https://sourceware.org/bugzilla/show_bug.cgi?id=14281)


결국 집에 VM 하나 설치하고 glibc를 target에 맞게 cross compile을 했다. 내일가서 잘될지는 모르겠지만... 별것도 아닌거 가지고 지금 계속 삽질한다 정말...

'Study > Linux' 카테고리의 다른 글

[Linux] Linux File System and the VFS  (0) 2016.07.14
[Linux] buildroot 관련 잡담  (0) 2016.06.02
[Linux] hardfloat compile과 softfloat compile시 차이  (0) 2016.05.31
[Linux] ARM gcc-4.7 cross compiler 설치  (0) 2016.05.18
[Linux] Partitioning  (0) 2016.05.17
[Linux] udev (user device)  (0) 2016.05.03
[Linux] Device node  (6) 2016.05.03
댓글