yuchi's Development Home


한달째 CUDA로 static Radiosity를 구현중이다. 

뭐 대단한 퀄리티를 바라는건 아니고 그저 예전에 만들었던 라이팅보단 조금 더 있어보이길 바란다.
그렇기 때문에 속도가 중요했다. 조금 더 있어보이는 정도를 위해서  6박7일간 계산을 걸 수는 없으니까.

목표는 한대의 PC만 이용해서 맵 하나당 1시간 이내로 굽는것.
따라서 CUDA를 사용하는 것은 당연했다.

가장 시간을 많이 잡아먹는 부분은 역시 패치와 패치 사이를 잇는 RAY와 삼각형의 충돌처리 부분인데 처음엔 단순 BSP트리를 사용했고 약  일주일쯤 전부터 KD Tree로 변경했다. 
인터넷에 돌아다니는 KT-Tree Traversal이라는 이름의 논문자료들과 거의 같은 내용이다.

트리를 변경하면서 무척 기대했다. 굉장히 빨라지지 않을까.
결과적으로 성능향상은 50%-90%수준.

일단 KD Tree Traversal 기법 자체가 탐색효율이 좋아서 그 부분에서 큰 이득을 봤다.
하지만 원했던건 탐색효율만은 아니었다.

기존 BSP트리에서 KD트리로 선회한 이유가 Stackless 트리 탐색을 사용하기 위해서였다. 
왜 스택없이 탐색을 해야했느냐...하면 느리고 용량 많은 Global Memory 대신 빠르고 용량 적은 Shared Memory를 스택으로 쓰고자 했기 때문이다. 스택이 꽉 차면 Stackless 탐색이 필요하니까.
그래서 Local Memory(는 실제로는 Global Memory에 할당된다)를 스택으로 사용하는 버젼과 Shared Memory스택+Stackless 버젼을 만들었다. 
오늘 드디어 테스트를 걸었는데 결과는 예상 밖이었다. 아니 사실은 절반쯤은 예상한 결과였다.

<Local Memory스택 버젼이 약간 더 빨랐다.>

Shared Memory용량 제한 때문에 Occupancy를 떨어뜨린 경우는 아예 왕창 더 느려지는 경우는 여러번 봤다. 
SM2.0이전 디바이스들은 Global Memory가 캐쉬지원을 받지 못하기 때문에 Global Memory억세스를 최대한 피하는 것이 옳다. 
그러나 SM2.0이상(페르미)의 디바이스들은 Global Memory에 L2캐쉬 적용이 되기 때문에 Occupancy를 떨어뜨리면서까지 Shared Memory를 사용하는 것은 다시 생각해봐야 한다.

어쨌거나 이론상 Occupancy가 같다면 Local Memory보다는 Shared Memory를 사용하는게 빠르다.
그렇지만 Occupancy를 떨어뜨리지 않는 선에서 local memory대신 shared memory를 사용해도 성능향상이 없는 경우가 있다.
이 경우는 Shared Memory사용에 따른 성능향상은 크지 않은데 비해 Shared Memory를 사용하기 위해 덧붙인 코드들 때문에 약간 더 느려진 것이다.

이번에도 그러했다.
몇 번이고 테스트 했지만 그냥 단순하게 Local Memory 스택을 사용한게 제일 빨랐다.
디바이스에 따라 차이가 있을거라고 생각한다. 
최근 수개월간 주로 GTX480과 580으로 작업했기 때문에 이런 결과가 나왔는지도 모르겠다.
아마 L2캐쉬 용량이 적은 디바이스에선 Shared Memory로 구현하는 쪽이 빠르지 않을까 싶다.

비록 성능은 기대에 미치지 못했지만 Shared Memory+Stackless 방식의 잇점이 있었다. 

바로 에너지 효율.

Shared Memory+Stackless방식에선 GPU Front Bus사용률이 1%정도, 온도는 76도 정도 였다.
Local Memory로 구현했을때는 FrontBus사용률 15%-20%, 80-81도.

GPU 3개쯤 꽂아서 병렬로 돌린다면 경제적,시스템의 안정성 측면으로 볼때 Shared Memory+Stackless방식이 나을지도 모르겠다.

CUDA Occupancy 계산기 사용하다가 알게 됐는데 SM3.0세대인 케플러(GTX680)는 활성화 워프 수와 레지스터 수가 두배더라. double처리에선 성능이 절반이고 SM개수도 절반이지만 동시 실행 가능한 원프 수와 레지스터 수로 상쇄가 되지 않을런지.

내 코드에선 float만 사용하니까 어쩌면 GTX680에서 더 빠르게 동작할지도 모르겠다.

GTX680으로도 테스트해 보고 싶지만 너무 비싸~




댓글 '2'

Hybrid

2012.06.09 01:32:00
*.201.70.43

스택을 local memory에 올리는 것은 사실상 현실적으로 봤을 때 무리가 크지 않나요?

사실 요즘은 용량이 워낙 커서 넉넉할 수는 있겠지만,

가령 제가 NDC 발표로 테스트 한 장면에서처럼 자동차 보닛 위의 경우나, 자동차 의자의 경우 스택이 200개가 넘어가는 것들이 많았습니다. 이론적으로는 거의 tree의 depth 만큼 있어야 하는데, 이게 사실 굉장히 클 수도 있지 않을까 싶은데... 괜찮을까요?

(코드상의 문제로는.. local memory로 잡으려면 정적으로 잡아야 하는데, 스택의 크기를 런타임시 동적으로 잡을 수 없다는 점도 문제가 될 수 있을 것 같구요.)

여치

2012.06.09 01:47:12
*.168.0.1

용량 문제는 일단 제 경우는 Local Memory를 크게 잡아야하는 경우는 Global Memory로 바깥에서 잡아주고 스레드마다 인덱스를 하나씩 줘서 자기 영역으로 쓰게 했었습니다. CUDA충돌처리 할때 그렇게 했었구요. 실제로 그땐 Local Memory를 많이 잡아서 그대로 소리없이 크래시하는 경우를 여러번 겪었었죠.

생각해보면 제가 스레드당 1KB이하의 Local Memory를 잡았기 때문에 속도가 떨어지지 않았을 수 있겠네요. Local Memory든 Global Memory든 크게 잡아야한다면 캐쉬히트율도 크게 떨어질테고요. 

Shared Memory를 쓰는 쪽이 안정적인 속도를 낼 수 있는 확률이 높을것 같습니다.






파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
List of Articles
번호 제목 글쓴이 날짜sort 조회 수

nVIdia 케플러 GK104의 CUDA성능은? file [2]

  • 여치
  • 2012-03-17
  • 조회 수 2815

NVIDIA Parallel Nsight 2.2 RC1 릴리즈 file [2]

  • 여치
  • 2012-04-12
  • 조회 수 3046

NDC 2012 발표자료 - GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리 file

  • 여치
  • 2012-04-25
  • 조회 수 2933

Parallel NSight 로 CUDA디버깅시 PC가 멎을 경우

  • 여치
  • 2012-05-17
  • 조회 수 2310

Radiosity Baking 작업중 file

  • 여치
  • 2012-05-28
  • 조회 수 5460

crt힙 메시지 출력에서 xxx.cpp대신 #File error#가 뜰때

  • 여치
  • 2012-05-29
  • 조회 수 4990

KD트리와 RAY충돌처리 코드 다시 만드는중 file

  • 여치
  • 2012-06-02
  • 조회 수 4186

CUDA로 구현하는 Radiosity - KD-Tree를 이용한 Ray충돌처리 [2]

  • 여치
  • 2012-06-09
  • 조회 수 5042

vs2010공백 및 탭 표시 핫키 file

  • 여치
  • 2012-08-08
  • 조회 수 8766

iOS엔진 프로젝트 file

  • 여치
  • 2012-09-15
  • 조회 수 7403

xcode 4.5로 업데이트 후 빌드한 바이너리 오작동

  • 여치
  • 2012-09-21
  • 조회 수 4149

hlsl ddx,ddy

  • 여치
  • 2012-10-12
  • 조회 수 6585

iOS엔진프로젝트 file

  • 여치
  • 2012-10-23
  • 조회 수 6194

Windows Phone 8 SDK 설치 및 간단 테스트 file

  • 여치
  • 2012-11-04
  • 조회 수 3846

요새 작업중인 복셀 관련... file

  • 여치
  • 2012-11-17
  • 조회 수 4627

Windows Store App에서 D3DCompile계열함수 사용

  • 여치
  • 2012-12-23
  • 조회 수 3517

windows 8에서 dxsdk 설치시 s1023에러를 뱉으며 실패할 때

  • 여치
  • 2013-01-12
  • 조회 수 5494

Create .lib file from .dll file

  • 여치
  • 2013-02-02
  • 조회 수 3632

Visual Studio 2012 Compiling Native for ARM

  • 여치
  • 2013-02-02
  • 조회 수 7460

jailbreaking된 Surface RT에 win32 D3D9엔진을 포팅해 보았다.

  • 여치
  • 2013-02-10
  • 조회 수 10572
天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet