第二章 文獻探討
第五節 O PEN CL™
第四節 PBRT
Pharr and Humphreys [4]著作的 Physically Based Rendering: From Theory to
Implementation (以下稱 PBRT)是一本把現今計算機圖學領域中幾乎所有的高階技
術從理論到實作完全具體呈現出來,書籍內容完整又有系統地闡述圖形rendering
流程,由它的實作程式所生成的圖片非常具有真實感絲毫不遜色其他同性質的商
業軟體,另外開源軟體 LuxRender 的系統也參考 PBRT 一書附帶的原始程式碼,
並且也成為市面上一些知名建模軟體的plug-in。
PBRT 一書非常值得研讀與參考,附帶的程式碼也可以幫助讀者更容易了解
理論是如何被實作,但由於PBRT 專案是給 CPU 程式碼並且是非即時的設計,而
本論文的光線追蹤則是希望設計成多平台架構皆能運行的形式,即使應用層面上 不同,PBRT 的光線追蹤架構仍非常值得學習與參考。
第五節 OpenCL™
OpenCL[5](Open Computing Language)是一套跨平台的程式撰寫框架,目前由
Khronos Group 負責制定架構,此異構平台可以由 CPU、GPU、DSP 或 FPGA…
等硬體加速器組成,在現今已是許多家廠商共同支持的多核心計算標準。本論文
的光線追蹤設計會採用 OpenCL 撰寫,原因在於光線追蹤的計算量非常龐大,為
了達到即時的速度勢必需要 GPU 的平行計算能力,而且不受開發平台的限制對
8
整合系統來說也是一個非常有利的條件,而下面稍微敘述由 Gaster, et al. [6]所撰
寫的Heterogeneous Computing with OpenCL 書籍,內文介紹到 OpenCL 兩個重要
的系統架構,分別為Execution Model 以及 Memory Model,在第四章會說明整合
設計如何配合其制定的規範完成光線追蹤演算法。
Kernels and the OpenCL Execution Model
OpenCL 程式可分為 host 端和 device 端,前者 host 端指的是一般應用程式且
負責掌握所有OpenCL 運作機制,後者 device 端則是實際執行 kernel 程式的裝置,
host 端可以啟動多個 kernel 程式進行不同的任務,並且也能同時指派不同的裝置
運行, OpenCL 平行計算以及多裝置設計是現今最被看好的優勢之一。
圖 2: OpenCL Memory model
OpenCL 記憶體階層示意,由上至下分為四層 Global、Constant、Local 和 Private,
程式內變數的可視範圍也依照記憶體階層不同會有所限制。圖片引用(2)
9
OpenCL 的 kernel 程式邏輯是以 C99 為基底所構成,所以和 C 語言幾乎沒有
太大差別,但注意的是不支援遞迴呼叫以及每個變數要遵守特殊的記憶體階層架
構,另外kernel 程式在 device 端是以 SIMT(Single Instruction Multiple Thread)模式
運行,裝置會同時執行複數的kernel 程式而其中每個單位被稱為 work item,並且
多個 work item 會被集結成群組稱為 work group,這些工作量以及分組的設定可
以根據不同裝置的運算特性做調整進而影響平行化的效率。
Memory Model
為了統一不同裝置上的差異,OpenCL 規範了記憶體階層架構如圖 2 所示,
由上到下分別是全域記憶體(global memory)、唯獨記憶體(constant memory)、局部
共享記憶體(local memory)和私有記憶體(private memory)四個階層。
全域記憶體是所有的 work item 都能存取的記憶體範圍,在階層中容量最大
但是存取速度則較慢,host 端的資料傳送到 device 端做計算通常都會利用此記憶
體階層。唯獨記憶體是全域記憶體的一部分且存取速度稍微快一些,但是此記憶
體階層的資料無法做修改。
另外局部共享記憶體的可視範圍以work group 為單位,根據不同硬體的規格
此記憶體存在的位置也不同,但通常會被對應到 on-chip 的記憶體上,此階層的
存取速度會比全域記憶體還快。私有記憶體存取範圍則是以每個 work item 為單
位,相當於硬體暫存器的位置,容量最小並且是記憶體階層中存取速度最快的。
10