ISBN 89-5884-324-1 98560
Chromium 기술 분석 보고서
이 중 연 (
Joong Youn Lee)
[email protected]
Visualization Team, Supercomputing Center
구 기 범 (
Gee Bum Koo)
[email protected]
Visualization Team, Supercomputing Center
한 국 과 학 기 술 정 보 연 구 원
제목 차례
I. 머리말 ··· 1
1. 개요 ··· 1 2. 배경 ··· 3II. WireGL ··· 4
1. OpenGL 병렬 API ··· 5 2. 네트워킹 ··· 9 가. 네트워크 프로토콜 ··· 9 나. 버케팅 (Bucketing) ··· 10 다. 상태 추적 (State Tracking) ··· 11III. SPU (Stream Processing Unit) ··· 15
IV. Chromium의 설정 ··· 33
1. Chromium의 동작 ··· 33 2. Mothership 설정 파일 ··· 33 3. Chromium 서버 ··· 34 4. Chromium 애플리케이션 ··· 36V. 다른 소프트웨어들과의 비교 ··· 40
1. 유사 소프트웨어 및 프로젝트 ··· 40 가. Multipipe SDK ··· 40 나. CAVELib ··· 40다. Distributed Multiheaded X11/GLX Proxy ··· 41
라. OpenSG ··· 41
마. Renderizer ··· 42
바. SV6 / SV7 ··· 42
사. VizServer ··· 43
표 차례
표 III-1. Binaryswap SPU 설정 옵션 ··· 16
표 III-2. Feedback SPU 설정 옵션 ··· 18
표 III-3. FPS SPU 설정 옵션 ··· 18
표 III-4. Hiddenline SPU 설정 옵션 ··· 19
표 III-5. Matte SPU 설정 옵션 ··· 20
표 III-6. Motionblur SPU 설정 옵션 ··· 20
표 III-7. Pack SPU 설정 옵션 ··· 21
표 III-8. Perf SPU 설정 옵션 ··· 22
표 III-9. Print SPU 설정 옵션 ··· 22
표 III-10. Readback SPU 설정 옵션 ··· 23
표 III-11. Render SPU 설정 옵션 ··· 25
표 III-12. Replicate SPU 설정 옵션 ··· 26
표 III-13. Saveframe SPU 설정 옵션 ··· 27
표 III-14. Tilesort SPU 설정 옵션 ··· 30
표 III-15. VNC SPU 설정 옵션 ··· 31
표 III-16. Wet SPU 설정 옵션 ··· 31
표 III-17. ZPix SPU 설정 옵션 ··· 32
표 IV-1. Chromium 서버 설정 옵션 ··· 36
그림 차례
그림 I-1 Chromium 계층 구조 ··· 2 그림 I-2. Chromium의 실행 모습 ··· 2 그림 II-1. WireGL 시스템 구조 ··· 4 그림 II-2. 병렬 마칭큐브의 실행과정 ··· 9 그림 II-3. 패킹한 네트워크 프로토콜 ··· 10 그림 IV-1. Chromium의 동작 방법 ··· 33소스 차례
소스 II-1. 애플리케이션 배리어를 사용한 쓰레드들 ··· 5 소스 II-2. 명령어의 실행 순서 ··· 6 소스 II-3. OpenGL 배리어를 사용한 쓰레드들 ··· 6 소스 II-4. 병렬 그래픽스 인터페이스 확장 ··· 7 소스 II-5. 병렬 마칭큐브 ··· 8소스 II-6. Hierarchical Dirty Bits 구조 ··· 13
소스 II-7. dirty bits 설정 알고리즘 ··· 13
소스 II-8. 상태 변경 알고리즘 ··· 14
소스 IV-1. Chromium 서버 설정 예 ··· 34
z
z
z z z z z z z
z
Thread1 Thread2
①
DrawPrimitives(opaq[1..256]) DrawPrimitives(opaq[257..512])②
DrawPrimitives(tran[1..256])③
DrawPrimitives(tran[257..512]) Thread1 DrawPrimitives(opaq[1..256]) glpBarrier(glpBarrierVar) DrawPrimitives(tran[1..256]) glpBarrier(glpBarrierVar) Thread2 DrawPrimitives(opaq[257..512]) glpBarrier(glpBarrierVar) glpBarrier(glpBarrierVar) DrawPrimitives(tran[257..512])glpNewBarrier (GLuint barrier, GLuint numCtxs) barrier->numCtxs = numCtxs;
barrier->count = numCtxs; glpBarrier (GLuint barrier) barrier->count--;
if (barrier->count == 0)
barrier->count = barrier->numCtxs; signal(all waiting contexts); else
wait();
glpDeleteBarrier(GLuint barrier) glpNewSema (GLuint sema, GLuint count) sema->count = count;
glpPSema (GLuint sema) if (sema->count == 0) wait();
(a) MarchSerialOrdered (M, N, grid) for (i = 0 ; i < M ; i++) for (j = 0 ; j < N ; j++) ExtractAndRender(grid[i, j]) (b) MarchParallel (M, N, grid) for (i = 0 ; i < M ; i++)
for (j = (myProc + i) % numProcs ; j < N ; j += numProcs) ExtractAndRender(grid[i, j])
(c) MarchParallelOrdered (M, N, grid, sema)
for (i = 0 ; i < M ; i++)
for (j = (myProc + i) % numProcs ; j < N ; j += numProcs) if (i > 0) glpPSema(sema[i - 1, j])
if (j > 0) glpPSema(sema[i, j - 1]) ExtractAndRender(grid[i, j])
if (i < M -1) glpVSema(sema[i, j]) if (j < N - 1) glpVSema(sema[i, j])
glBlendFunc (src, dst) {
if (arguments generate error) return update application context with src, dst set all blend function dirty bits
set all fragment state dirty bits }
<Hierarchical Dirty Bits> - Dirty Bit for State Element - DB for single state command
update_fragment_state () {
if (fragment bit set) {
if (alphafunc bit set && ...) ...
if (blendfunc bit set &&
application blendfunc != server blendfunc) {
generate glBlendFunc packet
server blendfunc = application blendfunc }
clear blendfunc bit
if (clearaccum bit set && ....) ...
}
clear fragment bit }
z
2
nz
z
z
z
z
z
z
z z z z z crappfaker crserver fonttest Chromium
OpenGL DLL Render SPU
Pack SPU
server_node = CRNetworkNode();
server_node.Conf('optimize_bucket', 0); render_spu = SPU('render');
z z
node = CRApplicationNode()
node.Conf('application', 'atlantis')
node.Conf('minimum_window_size', [300, 300]) node.Conf('match_window_title', 'perfly') node.Conf('show_cursor', 1)
z z z z z z
z z z
z z z z z z
z z z