전공은 물리학이고 컴퓨터로 계산하는게 주 업무입니다.
작업환경은 Fedora 16 64bit 이고 컴파일러는 인텔 C 컴파일러(icc 아마도 버전은 10으로 기억합니다..., 32bit, 64bit합본...)를 사용합니다.
이번에 계산을 좀 크게 돌리고 싶은데 램이 좀 부족해서 컴퓨터를 새로 샀습니다.
램을 16GB 끼우고 계산을 돌리려 하는데 32bit 컴파일러로 컴파일을 했더니 계산이 안되더군요.
배열을 만들 때 numerical recipe의 헤더파일을 사용하고 있는데 출력된 에러메시지는 램 용량이 부족할 때 뜨는 메시지였습니다.
혹시나해서 64bit 컴파일러로 컴파일했더니 계산이 됩니다.
32bit운영체제에서는 메모리 4GB 이상 지원이 안되는걸로 알고 있는데
혹시 32bit로 컴파일한 프로그램에서도 메모리 4GB이상 지원이 안되는 것인가요?
32bit 리눅스를 설치한 후 PAE옵션이 적용된 커널로 4GB램을 인식시키는 방법이 있는데
그리고 예전에 gcc 사용하다가 icc로 바꿨더니 계산 속도가 3배 빨라지던데... (30%쯤 빨라졌다는 사람들은 봤습니다.)
이게 가능한 일인건가요... (어쨌건 실제로 일어났으니 가능한 일이긴 합니다만... 프로그램을 너무 못짜서 그런건지 아니면... 붉은 것은 3배 빠르다거나...)
아... 그리고 64비트가 32비트에 비해 좋은점이 무엇인가요? 실제 계산을 돌려봤을 때는 시간이 별 차이가 없거나 심지어는 64비트의 경우가 더 느린 경우도 있었습니다만...
단순히 램을 더 많이 인식한다는게 전부는 아니겠죠?
1. 32비트로 컴파일한 프로그램은 당연히 4기가가 최대 지원 메모리입니다. 주소 지정 방식이 4바이트 포인터라는 점을 생각하시면 이해가 되시겠지요. 4기가 바이트 이상 지원하게 하려면, 기본 내장함수(new나 malloc등)가 아닌 별도의 라이브러리(가상메모리 지원라이브러리등)를 사용하셔야 가능하지 않을까요?
2. gcc와 icc의 차이는 모르겠지만, intel chip에 최적화 된 instruction code를 생성해내도록 인텔이 마법(파이프라이닝 최적화나 별도의 인텔 고유의 명령어셋 등)을 부렸다면 불가능할 것은 없겠죠.
3. 64비트가 32비트보다 좋은점은 말씀하신데로 메모리를 더 많이 쓸 수 있다는 점과, 연산을 한번에 32비트가 아닌 64비트를 처리할 수 있다는 점이 있겠군요. 그런데 코드를 64비트에 적합하도록 작성하지 않는다면 오히려 느려지는 경우도 있을 수 있습니다. (단순히 int 만해도 32비트는 4바이트, 64비트는 8바이트이므로 덧셈이야 어차피 둘다 한방이라지만, 메모리->레지스터, 레지스터->메모리에서 대역폭은 2배가 될 수 있다는 생각은 해 볼 수 있겠군요)