몇 가지 잡담

1. 요즘 CPU는 과거 386/486/펜티엄 시절처럼 클럭을 두 배씩 올리지 못한다. 정말 저 당시는 2~3년 마다 CPU 클럭 속도가 두 배씩 증가했다. 1997년에 산 펜티엄 166MHz가 2년 뒤 펜티엄 2 350MHz가 되었다. 그런데 2GHz를 4GHz로 올리기는 매우 어렵다. 그랬다간 CPU가 불탄다. 무어의 법칙이 예언한대로 18~24개월마다 반도체 집적 수준이 두 배씩 증가하였는데, 전력 밀도(power density) 역시 비슷하게 늘었다. 과거 CPU가 소비했던 전력에 비해 지금 CPU가 쓰는 전력은 어마하다. 만약 무어의 법칙마냥 이를 외삽해버리면 핵발전소에 맞먹는 전력 소비가 나온다. 그래서 클럭을 올리는데 굉장히 애로사항이 꽃피고(아 이 진부한 표현은 언제적 이야기지?) 대신 머리 수를 늘리는 방향으로 진화하고 있다.

그런데, 구세주가 나타났다. CPU 클럭 속도가 막혀 좀처럼 싱글 스레드 성능 향상에 애를 먹었는데 난데 없이 SSD라는 놈 때문에 새로운 길이 보인다. SSD는 익히 잘 아실 것으로 예상하고 자세한 설명은 생략. 이제 컴퓨터는 두 가지다. SSD이냐 SSD가 아니냐. 그런데 SSD 중에서도 워낙 구린 것이 많아서 다시 이 문장을 고치면:

인텔 SSD가 있는 컴퓨터인가? 그러하지 아니한가?

지금 34nm 기반 제2세대 인텔 X-25M 80GB의 가격이 다소 높다. 그런데 30만원 초반만 되면 아무 생각 없이 사면 된다. 인텔 SSD는 진리입니다. 다른 회사 제품 중에는 OCZ Vertex 정도만 고려하고 나머지 SSD는 무시하세요. SSD의 성능은 결국 4K 랜덤 쓰기 읽기인데 현재로서는 인텔 2세대 제품이 월등하다. 문제가 있다면 80GB는 너무 작다. 80GB를 쓰던 시절이 언제였는지도 모르겠다. 7~8년 전 같은데.. 정답은 SSD + 1/2TB 하드 조합.

윈도우 7 성능 점수에서도 하드디스크 점수가 제일 높다. 그래픽 카드는 그래도 nVidia 9800GT인데 너무 하네.

 

2. 컴퓨터의 성능은 레이턴시(latency, 응답시간, 측정 단위는 ‘초’ 같은 시간)와 스루풋(throughput, 단위 시간 당 처리량, 예: MB/s)로 표현할 수 있다. 그런데 이 둘을 개선시키는데 필요한 방법론은 사뭇 다르다. 그래서 나는 대충 “컴퓨터 성능이 좋아진다”라는 표현을 매우 싫어한다. 정확하게 레이턴시를 개선하는지 스루풋을 개선하는지 확실히 해야 한다. 대표적으로 파이프라인은 명령어 처리 스루풋을 늘리는 기술이다. 레이턴시는 개선시키지 못한다. 캐시는 명령어 완료 레이턴시 개선에 더 큰 목적이 있다 (궁극적으로는 명령어 스루풋을 늘리기도 하지만).

보통 데스크탑 같은 프로그램은 레이턴시가 생명이다. 왜 그런지 자세한 설명은 필요 없을 것이다. 그런데 보통 서버 쪽 프로그램은 스루풋이 훨씬 중요하다. 인터넷 쇼핑몰을 운영하는데 최종 결제 처리를 하는데 1초가 걸리나 2초가 걸리나 소비자는 큰 불만이 없다(물론 10초가 걸리면 이야기가 달라지지만). 그러나 스루풋이 딸리면 그건 바로 매상과 직결되므로 스루풋이 일반적으로 더 중요하다.

인텔 제품을 예로 들면, 서버 제품군으로 Xeon이 있다. 그런데 얘들이 데스크탑/노트북 용 프로세서와 구조적으로 다른 것은 거의 없다. 똑같은 놈인데 서버는 쉬지 않고 24시간 매일 돌아야하므로 높은 안정성이 요구된다. 그래서 가격이 더 비싸고 클럭이 데스크탑 제품군 보다 현격히 낮다. 예를 들어, Core i7-860의 클럭은 2.8GHz이고 가격은 290불이다. 그런데 같은 구조에 같은 클럭으로 Xeon 프로세서를 찾으면 1200불이다. 물론 Xeon 프로세서는 다중 소켓(그러니까 메인 보드에 여러 개 CPU를 꼽는 거)이 지원되는 등 부가 기능이 있지만 기본적인 명령어 파이프라인이나 캐시 구조는 같다. 그냥 완전히 같다.

학교 연구실에 있는 서버 머신의 클럭은 낮다. 그런데 나는 요즘 클럭이 빠른 컴퓨터가 필요하다. 결국 내 데스크탑 컴퓨터를 쓰고 있다. 실험 좀 빨리빨리 해보겠다고 오버 클럭도 더 빡세게 해봤다. 원래 2.67GHz인데 3.6GHz로 오버 클럭 했다. 정말 같은 Nehalem 기반의 Xeon 2.3GHz 프로세서보다 20~30% 이상 빠르다.

역시 컴퓨터 성능, 정확히 말해 레이턴시는 클럭이 짱. 그러니 인텔이 터보 부스트 같은 것을 넣는다.

 

3. A+ 학회에 논문 하나 붙이기는 쉽지 않다. 물론 한번에 척하고 붙은 사람도 더러 있지만 보통 한두 번 떨어지고 다시 수정하고 그래야 하나 붙을까 말까 한다. 운도 사실 굉장히 많이 따라야 한다. A+급 학회는 구현을 얼마나 잘 했냐 보다는 아이디어로 승부하는 경우가 절대 대다수다. 그런데 논문에서 제기하는 문제에 동의하지 않고 그 아이디어를 높게 평가하지 않은 리뷰어를 만나면 힘들다. (물론 객관적으로 평가가 가능하지만 리뷰어의 주관에 의존적인 것도 많다. 컴퓨터 시스템 분야가 수식으로 딱 증명되는 것이 별로 없기 때문이다)

이번에도 도전 중인데 결과는 또 떨어진다. 글을 개떡같이 쓴 내 잘못이 가장 크기는 하다. 그런데 이번에 받은 리뷰 중 비판적인 내용은 그 자체는 맞지만 도저히 수긍을 못하겠다. 지엽적인 구현 문제를 가지고 “나는 이 접근 방식이 맘에 안 들어”라고 말하면 대책이 없다. 논문이 맘 안 드는데 마땅히 깔게 없고 그러면 이런 문제로 걸고 넘어진다. 아니면 근원적으로 가지고 있는 문제를 따진다. 좋게 봐준 리뷰도 있지만 그래서는 붙기 어렵다. Strong Reject이 있으면 절대 못 붙는다. 다행히 이건 없는데 Strong Accept도 없다. 기적적으로 붙으려면 내 논문을 좋게 봐준 그 리뷰어가 최종 심사할 때 나타나 열심히 내 논문을 변호 해주어야 하는데 그런 가능성은 거의 없다.

지금 내가 하는 일은 일종의 프로파일러(profiler)를 만드는 것이다. 프로파일링이라면 개발자라면 아주 친숙한 단어일 것이다. 예를 들어, 어떤 프로그램의 병목 지점을 알고 싶다면 프로파일러를 돌려 어떤 함수가 자주 실행되고 또 그 함수가 얼마나 많은 캐시 미스나 페이지 폴트를 만들어 냈는지 살펴보면 된다.

내가 만드는 건 병렬화 가능한 루프를 찾아주는 프로파일러이다. 대충 이야기하면, 바이너리 exe를 입력 받아 실제 실행시키면서 이 프로그램이 작동하는 걸 분석한다. 그래서 병렬화 가능한 루프가 있다면 밝혀주고, 그러하지 않다면 그 이유(data dependence)를 자세히 프로파일링 해준다. 그런데 이 짓거리를 하는데 매우 많은 시간과 메모리가 필요하다. 지금까지 이 문제를 거론한 사람도 없다. 내가 만든 프로파일러와 유사한 논문이 있긴 있지만 전부다 작은 프로그램만 가지고 돌려보았다. 그런데 조금만 큰 프로그램을 돌리면 메모리와 시간이 감당할 수 없을 정도가 된다. 수십 GB메모리와 1천 배 이상 느려진다. 그래서 내가 이 문제를 풀었다(라고 황구라를..)

그런데 논문에서 이 프로파일러와 이 개선 알고리즘을 모두 이야기하니 오히려 글이 산만해지는 것 같다. 알고리즘 자체는 별 딴지도 없고 다들 좋다고 한다. 문제는 이 프로파일러의 방향에 대한 것. 어떤 리뷰어는 “너 왜 바이너리를 받는 걸로 하냐? 그냥 소스 받아서 하는 걸로 하지?” 라고 장황하게 딴지를 건다. 누가 모르냐. 이건 단순히 구현의 일부인데 이런 걸로 까면 정말 할 말 없다. 내 프로파일러는 소스 파일 받는 걸로도 쉽게 바꿀 수있다. 그런데 프로파일 하려면 매번 재컴파일 해야한다. 바이너리 수준의 프로파일러는 그럴 필요 없다. 분명 장단점이 있는데 “나는 이거 동의 안해” 이러면 어쩌라고 ㅠㅠ

또 하나의 문제는 프로파일러는 인풋에 의존적이다. 무슨 말이냐면, 입력 값에 따라 결과가 달라질 수 있다는 것. 이건 나만의 문제가 아니라 프로파일러, 일반적으로 말해 동적 프로그램 분석의 근본적인 문제다. 프로파일러만 하더라도 극단적으로 입력에 따라 자주 실행되는 함수가 다를 수 있다. 나도 이 문제를 알고 있어 분명 논의를 하기는 했지만 자세히 정량적으로 밝히기는 매우 어렵다. 이 자체가 하나의 논문 감이다. 그런데 리뷰어 한 놈은 이걸로 그냥 계속 물고 늘어진다. 엄밀히 말하면 ‘잠재적으로’ 병렬화 가능한 루프를 찾는 것이다. 왜 이걸 논문 첨부터 이야기 안 했냐고 투덜거린다. 사실 잘못하기는 했지만 그래도 이것만 딴지 거는데 힘이 빠진다.

무엇보다 어려운 것은 지금까지 이런 툴이 나온 적이 별로 없어서 설득시키기가 어렵다. 사실 내 논문에는 많은 허점이 있지만, 논문 중에 허점이 없는 것은 없다. 고작 2컬럼 10페이지에 모든 것을 이야기할 수도 없다. 그래서 이번에는 아예 툴을 제안하는 부분은 빼버리고 프로파일링 알고리즘에 집중해서 다시 도전하기로 했다. 사실 얼마 전 마감이었던 다른 A0 급 컨퍼런스에 냈다면 붙을 확률이 매우 높은데 괜히 객기를 부린 것 같기도 하고..

 

4. 서머타임이 끝난다. 한국에 있을 때처럼 “9시 뉴스”를 매일 보는 것이 아니라 오히려 일기 예보나 서머타임 끝 같은 사소한 것을 놓치기 쉽다. 그런데 기특하게도 윈도우 7의 시계 창이 이 사실을 알려준다.

11월 1일 오전 2시를 기점으로 다시 한 시간을 뒤로 돌리면 된다. 우리나라도 서머타임을 한다고 하는데, 정부에서 이걸 뭐 녹색 어쩌고 해서 호도하는 건 웃긴 것이 맞다. 그런데 또 서머타임을 하면 생체 리듬이 바뀌어서 짜증난다고 하는 사람이 많은데 그냥 이명박이 싫어요라고 말하는 것이 훨씬 논리적이다. 1 시간 시차로 생체 리듬이 바뀌어 한 달 동안 고생하신다는 분도 봤는데 이 분은 어떻게 해외출장 갈지 모르겠다. 서머타임으로 얼마나 에너지 절약이 되는지는 나도 좀 회의적이다. 그런데 그거 한다고 해서 큰 일 날 것도 없다.

서머타임 덕으로 한 시간 벌었다. 이 시간을 블로깅하는데 썼다. 보람차다.

by object | 2009/11/01 16:13 | 나머지 | 트랙백 | 덧글(35)
트랙백 주소 : http://minjang.egloos.com/tb/2462667
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 엘센 at 2009/11/01 16:24
인텔것이 확실히 좋나보네요... 저는 명정보기술 MIT S2030GS3-M, 30GB 모델을 쓰고있는데 저장장치 체험점수가 6.5밖에 안나오는군요.
Commented by object at 2009/11/01 16:27
현재로서는 인텔 SSD 2세대가 압도적이고 그 다음이 우리나라 기업인 Indilinx에서 만든 barefoot 컨트롤러를 쓴제품들이 좋습니다. 나머지 SSD는 4K 쓰기/읽기가 좋지 않고 시간이 지남에 따라 성능 저하도 심합니다. 허접한 SSD는 그냥 이동성이 강조되는 넷북 정도에나 어울리지 고성능을 위한 데스크탑에는 쓰시면 안됩니다. 벨로시랩터보다도 못합니다.
Commented by 마일즈 at 2009/11/01 17:40
안녕하세요. 그 동안 읽어보기만 하다가 오늘 논문리뷰 이야기가 재미있어서 글을 써봅니다.
저도 비슷한 분야를 하는 데요. 첫 리뷰어의 바이너리 이야기는 좀 의외입니다. 저는 컴파일러를 하는데 회사나 연구소에서 일하는 사람들은 소스코드를 직접 구해서 일하는 경우가 오히려 적다고 컴파일러를 이용한 소스코드 분석에 참 회의적이구나 하는 느낌을 많이 받았습니다. 특히 많은 중요한 라이브러리들은 소스코드가 없으니 바이너리 분석외에는 방법이 없지 않나요? 컴파일러가 alias analysis를 하는데 프로그램 중간에 소스를 분석할 수 없는 함수가 등장하면 바로 거기서 그냥 포기하고 말거든요.
그리고 입력에 의존적이라는 리뷰도 독특합니다. 사실 동적 분석이나 프로파일링을 하는 이유가 컴파일러가 입력을 모르는 약점때문에 하는 것인데 그걸 문제삼는 다는 것은 리뷰어가 논문에서 프로파일링을 하는 이유를 다르게 생각하는 것 같습니다. 실제 벤치마크에서 train data와 ref data가 다른 결과를 보여주는 병렬루프는 벤치마크 전체 실행시간의 1%도 영향을 미치지 못하는 의미없는 루프가 대부분이지 아닐까 생각됩니다. 제안하는 알고리듬이 '잠재적인' 병렬루프를 찾으려고 했는데 실제 돌려보니 중요한 병렬루프는 다 찾았다고 숫자로 보여줄 수 있지 않을까 생각됩니다.
제 친구도 말하기를 호의적인 리뷰어 만나는 것도 운이라고 합니다. 다음번에는 좀 성의있는 리뷰어분들이 걸리시기를...
Commented by object at 2009/11/01 17:58
네, 그 이야기 분명 논문에 썼습니다. 라이브러리 같은 건 당장 소스가 없으니 못 돌리죠. 그런데 그 리뷰어는 convincing 하지 않대요 -_-; 사실 저 같은 경우는 결국 최종 결과를 소스 코드로 매핑을 해야 합니다. 그래서 디버깅 정보가 있으면 좋죠 (없어도 그냥 바이너리 주소로 말할 수는 있어요). 그리고 궁극적으로 프로그래머가 다시 프로그램을 수정해야하니 소스에 접근을 할 수 있어야 하긴 합니다. 이런 이유로 그 리뷰어가 까더군요;;

두 번째, input sensitivity도 지적하신 것 그대로가 제 생각입니다. 어차피 병렬화할 루프는 hot loop이고 얘들은 train/ref에 상관없이 거의 동일한 행동을 보입니다. test input도 사실 거의 비슷하게 나와요. 당연히 약점이 될 수는 있어요. 그런데 그 사람은 그냥이 논문이 싫으니 프로파일의 근본적인 문제점인 입력 의존성을 걸고 넘어진 것이죠. 말씀하신바와 같이 이미 논문에 "20여개의 랜덤하게 만들어진 입력을 넣고 돌려봤는데 주요 루프는 다 같게 나오더라"라고 써놓았어요. 그런데 구체적인 threshold니 그런 분석이 없다고 까요. ㅎㅎ

일단 글을 잘 써야하겠고요. 글을 잘 못쓰면 그냥 까이기 좋으니깐요. 그리고 리뷰어를 정말 잘 만나는 것도 중요한 것 같습니다.
Commented by 칫솔 at 2009/11/02 00:07
SSD가 역시 무섭군요. 하드디스크로는 6을 넘기기 어려운데 거의 최고 값에 이르는 결과치가 나오다니..
Commented by object at 2009/11/02 09:30
돈이 아깝지 않다면 이제는 무조건 SSD라고 해도 될 것 같습니다.
Commented by redragon at 2009/11/02 01:28
ASPLOS는 A+ 그 이상 (흔히 S급) 으로 불리죠. 고생 많으십니다. ㅡ.ㅜ
말씀하신 내용은 학회 성격과도 얼추 어울려 보이는데, 리뷰가 참 난감하네요.

run-time보다 static method를 좀 더 맹신하는 입장에서 그 리뷰어를 이해해보자면;;
test input에 대해 거의 비슷하게 나오는 병렬루프라면, 소스 레벨에서 찾아낼 수 있는 방법이 있을 것이라고 봤을테고, 그렇다면 제시하셨던 데이터는 그 리뷰어 입장에서는 연구의 시작점 정도로 보였을지도 모릅니다. 이를테면, 여러 랜덤 입력에 대해 이런 메트릭으로 여차저차 해보니 다들 비슷한 어떤 동작을 보임에서 착안해서 그것을 compile-time에 찾아보고자 했다. 이렇게요.
그래서 나도 알고 쓴 사람도 알고, 심지어 언급하기까지 한 자명한 trade-off 걸고 넘어진거 아닌가 생각드네요..;;

저 역시 저도 알고, 언급도 했는데 자꾸 자명한 차이점만 계속 이야기하는 리뷰어 생각나서 잠시 울컥했습니다. ㅡ.ㅜ
그러는대는 다 이유가 있다고 생각해 보려고 하는데, 그럼에도 어떻게 설득해야할지 잘 모르겠습니다. :'(
쓰고보니 맥 빠지는 덧글이네요. (_ _)
Commented by object at 2009/11/02 09:30
좋은 의견 감사합니다.

먼저, static time에 소스를 가지고 병렬 가능한 루프를 찾는 것은 alias analysis의 부족함으로 C/C++에서는 안 되는 경우가 매우 허다합니다. 아주 간단한 루프 조차 병렬화가 되지만 production compiler들은 대부분 못 하고 맙니다. 일부 research compiler들은 할 수도 있지만 자동 병렬화 기능이 있는 인텔 컴파일러나 Portland 컴파일러는 아주 취약합니다. 그것도 제 일의 큰 motivation이기도 하고요. 소스만 가지고 의존성을 증명해서 병렬화 가능 여부를 따지는 테크닉은 이미 20~30년이 되었고요, 일부 제한적으로 포트란 같은 언어에서는 잘 돌아가지만 C/C++로 넘어가면 거의 쥐약입니다. 그 리뷰어의 논지는 사실 별 것 없고요, input sensitivity를 그냥 걸고 넘어지는 것입니다. 특별히 새로운 내용은 없고 다 아는 내용만 읊어놓는 수준이었습니다.
Commented by 마인 at 2009/11/02 17:16
아...리뷰...

분야가 달라서 전혀 이해는 안되지만... ^^; 정말 리뷰어 잘 만나는 것도 운인 듯. 첫 논문 리뷰 받고 어찌나 눈앞이 깜깜했던지...

힘내십시요. 좋은 결과 있길 기원합니다!
Commented by object at 2009/11/03 11:14
몇 번 떨어지면 익숙해집니다.
Commented by daybreaker at 2009/11/03 02:08
저는 삼성SSD 쓰고 있는데 SSD 자체에 대한 불신(?)이 있어서 반신반의하고 있지만 일단 아직까진 괜찮습니다. 근데 벤치마크 돌려보니 확실히 4K 읽기/쓰기는 인텔 것을 못 따라가더군요.;; 윈도7 기준 저장장치 체험지수는 7.2입니다.

요새 Hadoop으로 분산처리 프로그래밍을 배우면서 PageRank 알고리즘을 짜고 있는데 정말 서버 작업에선 쓰루풋이 중요하다는 사실을 깨닫고 있습니다. ㅠㅠ
Commented by object at 2009/11/03 11:14
싸구려 SSD 말고 하이엔드 SSD는 하드보다 나으면 나았지 못하지는 않습니다.
Commented by Hoppang at 2009/11/03 09:31
한국에서 서머타임이 환영받지 못할 이유는 한가지죠.

"한시간 일찍 출근하되 퇴근은 정시에 하리라" ...다른거 없습니다 우후후

SSD는 그새 가격이 꽤나 떨어진거 같지만(초기에 경악할만한 가격을 보고 그에 부응하여 경악을)

아직도 비싸요비싸
Commented by object at 2009/11/03 10:41
서머타임을 해도 출근 시간은 변함이 없습니다. 9시에 출근하면 서머타임을 해도 9시에 출근합니다. 한 시간 일찍 출근하는게 아닙니다. 일부 블루컬러 노동자는 노동 시간 연장의 우려가 있지만 (해가 떠 있으면 일을 더 하니깐요) 사무직이 왜 서머타임으로 "한 시간 일찍 출근한다"는 말이 나오는지 모르겠습니다. 일반 직장인들은 출퇴근이 시계에 의해 지배받지 밖에 해가 떠 있는 것은 상관이 없잖아요. 서머타임은 출근 시간을 앞당기는게 아니에요. 그렇게 따지면 인구 3억의 미국은 어떡하라고...
Commented by Hoppang at 2009/11/03 12:24
공연히 남의 블로그 너절하게 만드는것 같아 다 지웠슴다 -ㅁ-
진지하게 쓴 글이 아니고 그냥 농담이었어요.
애초에 서머타임 한다는 핑계로 연장근무시킬 악덕업주라면 서머타임제를 하든 안하든 뭔가를 찾아내겠죠
Commented by object at 2009/11/03 13:36
아네.. 괜찮습니다. 하도 서머타임 이야기만 나오면 근로시간이 길어진다는 소리가 들려서; 농담인지 모르고 제가 너무 진지하게 답변 했습니다. 죄송합니다.
Commented by neo at 2009/11/03 16:24
고생이 많으십니다. input sensitivity 라면 어떤 벤치마크 쓰시는 지 모르지만, 같은 프로그램에 다른 input을 주어서 실험 결과를 하시면 될 거 같은데요. 물론 아시다시피 근본적인 문제에는 접근 할 수 있지만, 한계점을 밝혀 주니깐 괜찮은 거 같구요. OpenMP에서 사용하는 dependency analysis로 loop level parallelism detect하는 걸 좀 언급하신 거 같은데, 현재 하시는 동적 방법이 이런 정적 방법보다 많이 parallelism을 올릴 거 같은데 한번 비교하실 수 있으면 매우 재미있을 거 같습니다.

매일 엿보다가 이렇게 글을 남깁니다.
Commented by object at 2009/11/03 16:36
조언 감사합니다.

네, 말은 쉬운데 그게 쉽지 않습니다. SPEC 벤치마크는 인풋을 랜더마이즈 하는 것이 매우 어렵습니다. 고작 있다면 gcc 같은 벤치마크는 여러 소스 파일을 받는 세부 단계로 나뉘어 있어서 비교를 하면 되긴 되는데 gcc 같은 프로그램에서 병렬화 가능한 루프를 찾는 건 사실 기대하기 힘들죠.

그래서 간단한 OpenMP 기반의 수학 응용 프로그램의 입력값을 랜덤하게 해서 테스트를 했는데 다 같게 나왔습니다. 당연하죠;; 이걸 근원적으로 고찰하려면 이 자체가 하나의 논문 감입니다. 이런 문제는 메모리 릭 디텍션이나 데이터 레이스 디텍션에도 공히 있는 문제입니다. 발견된 메모리 릭은 그 인풋에만 해당하는 것이겠죠. 그러니 제가 억울해하죠. 이야기를 하지 않은 것도 아니고.

뒷 부분이 제 일의 동기 중 하나입니다 (약간 표현에 앞뒤가 안맞기는 하지만.. OpenMP는 병렬화 프로그래밍 방법론이라 dep analysis랑은 상관 없죠). 위에서도 이야기 했는데 컴파일러가 정적 정보만 가지고 C/C++ 프로그램에서 병렬화 가능한 루프를 찾는 건 쉽지 않습니다. 간단히 OpenMP로 병렬화한 루프 조차 컴파일러는 잘 못 찾습니다. 어떨 때 컴파일러가 못하는지 분석도 다 했고, 또 제가 만든 툴이 얼마나 잘 찾아 내는지 그건 다 비교해서 논문에 잘 적어 놓았습니다. :) (어떤 리뷰어는 이 부분이 재밌다고 하고 또 어떤 리뷰어는 뭐가 새롭냐 그러기도 하고... 어느 장단에 놀아야 할지 모르겠습니다..)
Commented by neo at 2009/11/03 16:49
아 그렇군요. 제가 dependency analysis 부분은 parallelizing compiler를 언급하려고 했는데, 급하게 쓰다 보니 그렇게 되었군요. 근데 이미 언급하셨다니 잘 하신 거 같구요. SPEC을 쓰시면, SPECcpu가지고 동적으로 parallelize하고 SPEComp를 OpenMP compiler를 가지고 컴파일하셔서 비교하시나요? 제 경험에 의하면 SPEC의 Fortran program들이 잘 병렬화 된 거 처럼 보이더라구요. 시뮬레이션이 아니고 실제 실험을 하시는 거 같아서 물어봅니다.
Commented by object at 2009/11/03 18:07
이야기를 하면 길어지는데.. ㅎㅎ SPEC을 쓴 주 목적은 오버헤드를 보여주기 위함이고요. 그래서 SPEC 2006을돌려봤습니다. SPEC 2006은 아시다시피 상당한 규모의 벤치마크입니다. train 셋 가지고도 웬만한 동적 분석하면 시간과 메모리가 엄청나게 먹습니다. 제가 했는 건 이 오버헤드를 줄이는 것입니다. 이게 일차 목표라서 (물론 다른 목표도 뒤에 있지만) SPEC은 메모리/시간 오버헤드 보여주는데 썼습니다.

SPEC OMP 중에 컴파일러가 자동 병렬화 할 수 있는 것도 있습니다. 포트란은 제법 잘 해줍니다. 하나 빼고는 다 하던 것 같았습니다. 그러나 C 프로그램은 그러하지 않습니다. 제 프로파일러가 동적으로 병렬화 가능한 루프를 찾아주는 것이니 이럴 때 비교 할 수 있습니다. 컴파일러는 못했는데 우리는 한다~ 그런데 사실 이건 너무 자명한 것이죠. 컴파일러가 alias analysis가 부족하거나 cfg가 복잡해서 못하는 걸 동적 분석은 당연히 밝혀 낼 수 있어야 합니다. 이 부분은 충분히 보여줬고 굳이 SPEC OMP까지 쓸 필요도 없어서 간단한 OpenMP 벤치 스윗을 이용했습니다.

그런데 사실 이 부분도 간단하지가 않은 것이 바이너리에서 작업하다보니 불필요한 dependence가 자주 튀어 나옵니다. 대표적으로 for (int i = 0; i < 10; ++i)에서 보이는 i같은 induction variable이죠. 소스 수준에서 작업하면 이거 그냥 간단하게 날리고 instrumentation해서 분석하면 됩니다. 그러나 바이너리만 있는 상태라면 이런 i 변수를 찾는 것이 결코 간단하지 않습니다. 이런 걸 잘 걸러주는 것도 매우 중요합니다. 그러하지 않으면 거의 모든 루프가 dependence가 있다고 나오니깐요.

그러나 정작 문제는 이게 아닙니다. 저희가 궁극적으로 원했던 것은 이론적으로 컴파일러가 할 수 있는 걸 찾아내주자가 아니라 그 보다 더 나가는 것이였죠. SPEC OMP를 보면 barrier 같은 걸 쓴 것이 꽤 있습니다. Flow dependence가 근본적으로 있어 컴파일러가 절대 할 수 없는 것이죠. 이럴 때 어떻게 의존성을 분석해 프로그래머에게 이렇게 저렇게 해서 병렬화 하라고 코치할 수 있는게 제가 꿈꾸는 것인데 이 문제는 너무 방대해서..... 그래서 이 문제 중 일부를 골라 풀려고 합니다.

에, 제가 원하는 방향을 충분히 적지 못해 충분히 납득이 갈런지 모르겠네요. 아뭏든 비슷한 연구 하시는 것 같아 반갑습니다. 이메일로 주시면 더 자세히 이야기할 수도 있습니다.
Commented by nanami at 2009/11/03 23:35
mlc도 좋나요?
mlc는 믿음이 가지 않아서.
사용 도중에 행여나 데이터가 망가질까봐.
하지만 slc는 너무 비싸고.
그리고 ssd를 raid0로 묶어야 성능이 제대로 발휘된다는 말도 들었는데요.
그러면 가격이...ㅠㅠ
Commented by object at 2009/11/04 01:51
요즘 1TB 이상 하드는 DOA가 빈번히 발생합니다. 제대로된 컨트롤러를 단 (싸구려 SSD 말고요) MLC 기반 SSD는 하드보다 절대 안정성에서 못하다고 생각하지 않아요. RAID0으로 안 해도 성능 이미 잘 나옵니다. SAS급 하드를 제외하고 가장 빠른 벨로시랩터보다도 순차 쓰기 전송률만 비등하고 나머지는 압도합니다.
Commented by SY Kim at 2009/11/04 13:18
SSD가 SAS하고 비교했을때는 어느 정도 인가요? 여지껏 SAS가 가장 빠르다는 생각을 가지고 있었는데... 수치를 보면 SSD가 동급일수도 있다는 생각이 들어서요.
Commented by object at 2009/11/04 18:58
제가 스토리지쪽에 대한 지식이 없어서 뭐라 드릴 말씀이 없는데, SAS는 컨트롤러니까 SSD와 결합해서 산업용으로 쓰일 수 있습니다. 그런데 SSD와 HDD는 워낙 가격/성능/용량 차이가 뚜렷해 어느 한쪽이 대체할 수 있는 성질은 아닙니다. 캐시처럼 메모리 계층을 이루겠죠. 또한 워크로드 특성에 따라 적절히 잘 선택해야겠죠.

관심있으시면 http://www.intel.com/idf/ 로 가셔서 스토리지/메모리 트랙의 강연 PDF를 보십시오. MEMS003 같은 자료를 보면 엔터프라이즈 환경에서 SSD/SAS에 대한 이야기가 있습니다.
Commented by nanami at 2009/11/05 16:41
윈도우7에서 인텔 sdd 사용하려면
Matrix Storage Manager를 꼭 설치해야 하나요?
누구는 하네, 누구는 안하네 말이 많네요.
Commented by object at 2009/11/07 04:21
모르겠습니다;; 아직 최신 펌이 불안정하니 안정해지면 받아 쓰고.. 저는 그냥 anandtech 같은 곳에서 정보 구합니다.
Commented by saiparan at 2009/11/06 21:42
재미있는 연구를 하시는군요.
혹시 Intel Parallel Advisor 와 비교 설명 부탁해도 될런지요.
Commented by object at 2009/11/07 04:52
제가 사실 인텔에 계신 분이랑 같이 일하고 있어서.... 패러럴 스튜디오는 사실 지금까지 나온 인텔 제품군을 그냥 다시 감싼거고요. 원래 제가 하는 것 같은 걸 넣으려고 했으나 못 들어갔죠. 잘 안돌아가서;; 그래서 제가 열심히 삽질 중입니다.. 사실 계획은 whatif.intel.com 같은 곳에서 공개 하려고 하나 제가 맨날 놀아서 말이죠. 사실 바이너리 레벨은 한계가 좀 많긴 해요. 이건 컴파일러/IR 수준 instrumentation에서 하는게 편하기는 합니다.
Commented by AKI☆ at 2009/11/11 09:53
학회에 붙지 못하시는 것은 컨텐츠의 부족함(?)도 나름대로 문제이실 수 있겠지만, '입소문'이라든가 '그들만의 리그'에 편입되지 못하셔서 더 진입 장벽이 어려운 것도 있으신 것 아닐까 하는 생각을 해봅니다. 확실히 어느 정도 '그들만의 리그'에 들어서게 되면 어느 분야나 논문 쓰기가 좀더 쉬워지는 경향이 있지 않나 싶습니다.

아무리 익명 저자로 리뷰어를 한다고 하더라도, 주제라든가 하는 것들을 검색해보면 어떤 분야의 저자인지 대충 감을 잡을 수 있을거고, (figure 그리는 스타일 등으로 짐작할 때) 그러다 보면 팔은 안쪽으로 굽는 것 아닐까 하는 생각을 해봅니다.

저같은 경우도 평소 부족했던 '그들만의 리그'에 들어가기 위해 이번에 일본으로 갑니다 ㅠㅠ 과연 이게 향후 논문 작업에 얼마나 효과가 있을지 모르지만, 혹시라도 연구로 고생중이신 와중에 이런 해결책도 도움이 되실수 있다는 것을 알려드리고 싶어 답글 남겨봅니다. :)
Commented by object at 2009/11/11 12:47
그들만의 리그(?) 때문에 그런 것은 아닙니다. 지도교수 같이 일하는 교수 모두 다 이쪽에서는 유명한 분이라.. 그런데 제가 느끼기로는 저희 분야에는 그런 것은 별로 없습니다. 굳이 있다면 위스컨신 대학 출신들이 여러 대학의 교수로 가 있다 보니 서로서로 리뷰를 잘 해줘 논문이 많이 붙도록 한 것은 있습니다만. 말씀대로 더블 블라인드지만 사실 다 압니다. 저도 리뷰 해보면 제대로 쓰여진 페이퍼라면 거의 누가 썼는지 쉽게 알 수 있습니다.

그들만의 리그같은 문제가 되는 것은 다른 커뮤니티로 옮길 때 발생합니다. 운영체제 하는 사람이 아키텍처 쪽에 논문 내면 쉽게 꼬투리 잡혀 떨어질 수도 있죠. 그런데 그런 일이 정치적으로 자주 발생한다고 들어보지는 못했습니다. 명성있는 컨퍼런스가 그런 문제가 심각할 정도로 있다면 권위를 예전에 잃었겠죠.
Commented by winner at 2009/11/15 02:08
한국의 사무직은, 특히 IT는 노동시간이 블루칼라 스타일입니다.
재미있는 연구를 하시는데 Haskell 같은 언어를 공부해보신다면 비교하는게 재미있을 것 같아요.
제가 알기로 Fortran이 C, C++ 보다 최적화를 더 잘 하는 것이 alias 문제로 알고 있는데 이 문제는 C 언어의 창시자들도 익히 알고 있던 문제죠. 이런 문제를 해결하는데 profiler를 쓰는 것이 과연 올바른 방식인지는 의문이긴 합니다.
Commented by object at 2009/11/15 02:34
Haskell 같은 함수형 언어 자체가 패러럴/컨커런시를 잘 지원하는 것은 사실 아주 큰 의미가 없습니다. 이건 단순히 병렬로 돌아가야 하는 코드를 표현하는 방법을 더 쉽게 직관적으로 바꾸는 것이죠. 관심이 있으시면 자바나 LISP에는 있고 C++에서 도입이 검토되는 future라는 병렬 프로그래밍 컨스트럭터를 살펴보세요. 제가 관심이 있는 것은 어디를 병렬화, 또 어떻게 병렬화할 것인가입니다. 어떻게 표현하는 것은 프로그래밍 언어의 문제입니다.

프로파일러가 쓰는 것이 과연 올바른 방식인가라는 질문에는 PGO(Profile-Guided Optimization)을 참고해보시면 답을 얻으실 수 있을 겁니다. 동적으로 프로그램을 분석하는 것은 소프트웨어 엔지니어링, 컴파일러, 아키텍처 가릴 것 없이 매우 큰 분야입니다. 아시다시피 프로파일링은 동적 프로그램 분석 중 대표적인 방법이고요. 메모리 릭, 데이터 레이스, 데드락 같은 것이 정적 분석도 있지만 약점이 많아 동적 분석을 많이 하죠.
Commented by winner at 2009/11/15 05:40
사실 저는 정적분석과 동적분석 중 정적분석을 더 우선으로 여깁니다. 정적분석을 동적분석보다 더 중요시 여기는 것은 아닙니다. 그 이유는 동적분석은 도구에 의지하는 바가 커서 사람이 이해하기 어려운 점이 있기 때문입니다.

하지만... 네, 동적분석이 중요하다는 점은 맞는 말씀입니다.
특히 compiler 같은 제품을 만들 때는 대단히 중요한 문제로 알고 있습니다. Compiler 개발자들은 언어와 machine에 대해서 전문가들이고, 이런 분들이 더욱 더 강력한 최적화 알고리즘을 개발하기 위해서 machine learning 기술을 쓴다는 말도 있더군요. PGO의 연장선상에서 이루어지는 것이겠지요.

그런데 함수형 언어가 병렬로 돌아가야 하는 코드를 표현하는 방법을 더 쉽게 직관적으로 표현하는 것이다라는 말은 조금 이상한 느낌입니다. 일반적으로 함수형 언어에 OpenMP 같은 기술법은 없습니다. F# 은 예외... Lisp을 제가 잘 아는 바는 아니지만 Java, Lisp에도 언어적으로 그런 것은 없지 않나요? Library 차원이나 혹은 도입을 검토하는 기술이라면 모를까...

제가 정적분석을 동적분석보다 더 우선으로 여기는 것은 현재 가장 큰 병목은 사람이라고 생각하기 때문입니다. 아무리 뛰어난 도구가 등장한다 하더라도 과연 사람이 쉽게 사용할 수 있을까요? 이해할 수 없는 도구를 잘 사용할 수 있을런지 저는 의문스럽습니다. 논문검토자가 동적분석에 대해서 이해를 못한다는 것은 그 사람에게 정적분석을 가르쳐서 그 한계를 이해시키는게 좋지 않을까라는... ^_^...
서론에다가 정적분석은 한계가 있다라고 한 줄 쓰는 것도 좋겠네요.

다르게 말하자면 정적분석으로 할 수 있는 것은 정적분석도구를 활용하는게 좋다고 생각합니다. 동적분석은 정적분석으로 할 수 없는 것에 집중해야겠지요.

그런데 C++ 의 future라는 것은 C++0x 말씀인가요? 병렬기술이름에 future라고 쓰지는 않을 것 같은데...
Commented by object at 2009/11/15 06:28
에.. 그냥 여담으로 살짝 연구 내용을 쓴 것이라 제 의도/동기가 충분히 쓰여지지 못했습니다. 그래서 생긴 오해인 것 같군요.

1. 정적/동적 분석은 어느 하나가 우위/우선을 논할만한 것은 아닙니다. 동적분석은 도구에 더 의지? 정적분석도 똑같이 도구을 쓰잖아요. 정적도구도 사용자가 이해하기 힘들 수 있죠. 왜 그렇게 생각하시는지 궁금하네요. 정적/동적은 서로 경쟁 상대가 아닙니다. 어느 한쪽이 동기를 제공은 하지만 한쪽을 대체하는 것이 아닙니다. 저도 정적이 구려서 동적을 쓰자는게 아닙니다. 정적의 단점을 보완하자는 것이죠.

2. Haskell 같은 언어는 따로 패러럴/컨커런시 섹션이 있습니다. OpenMP로 비유하기는 그렇지만 병렬 가능한 코드를 기술할 수 있습니다. Haskell을 언급하셔서 아실 것으로 예상했습니다. http://www.haskell.org/ghc/docs/6.6/html/users_guide/lang-parallel.html Lisp도 이런게 있고요.

3. 리뷰어가 동적분석에 대해 이해 못하거나, 컴파일러의 정적분석에 한계가 있다는 걸 모르는게 아닙니다 -_- 위 댓글 중에서 말했는데, 제가 하는 일의 큰 동기 중 하나는 컴파일러의 자동 병렬화의 단점이고 잘 말해놓았죠. 한줄이 아니라 한챕터로 썼죠. 동적분석 논문에 "왜 정적분석으로 안 하냐"라고 태클거는 멍청이는 없습니다. 그 반대도 없고요. 제가 비판 받은 것은 그러한 이유 때문이 아닙니다.

4. C++0x의 future는 아직 도입도 안 된 것인데 때마침 허브 서터씨의 글이 있습니다. 이미 일부 언어에서는 도입한 병렬/병행 프로그래밍 컨스트럭터(혹은 라이브러리)입니다. http://herbsutter.wordpress.com/2009/11/11/trip-report-october-2008-iso-c-standards-meeting/
Commented by winner at 2009/11/15 10:59
제가 참 많이 오해한 것 같습니다.(정확히 파악이 안되서 '같습니다' 정도 밖에 표현을 못하는...)
par은 확실히 몰랐는데 GHC 특징적 기술이군요. 왠지 깔끔하지 않은 것 같은 느낌이 드는 표현법이군요.
Herb Sutter의 글을 보니 왜 future라고 이름지었는지 알겠네요. lambda를 사용한 기법이 마치 Ruby thread를 보는 느낌인데 OOP style로 포장이 되었네요.
아직 제가 충분히 이해를 못해서 찜찜함이 남는 것은 사실인데 더 이야기해봐야 제가 이해할 수 있는 수준이 아닌 것 같습니다... ^_^
논문 마무리 잘 하셔서 좋은 학회에서 발표할 수 있기를 기대합니다.

미국에서 있었던 김연아의 세계신기록을 경신을 SBS로 본 후 덧글남깁니다. ^_^.

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스