Intel 發表 Open Source 的 SPMD 程式編譯器

| | 0 Comments| 10:35
Categories:

「ispc」是 Intel 發表的一個開放原始碼的編譯器,他的名稱就是「IntelR SPMD Program Compiler」,網站是:http://ispc.github.com/index.html

ispc 比較特別的是,基本上是一個在 CPU 上、針對「SPMD」(single program, multiple data、參考 wikipedia)架構開發出來的編譯器。在 SPMD 的架構下,程式開發者基本上是寫了一段處理單筆資料的程式,然後在硬體上同時產生出許多這段程式的 instance,並給這些程式不同的資料、來進行平行化計算。

而 SPMD 的概念,目前在 GPGPU 這類的 data parallelism 程式開發上,使用的相當廣泛,像是 nVIDIA CUDA 或是 OpenCL,基本上也都是這樣的概念;也就是寫了一個 kernel function 後、然後同時、不停地去讓 kernel function 處理不同的資料。

和 CUDA 和 OpenCL 相同的,ispc 也定義了一套自己的 C-Like 的 SPMD 程式語法,用來撰寫他的 ISPC Program。但是 ispc 比較特別的地方,則是在於它的平行化不是針對 GPU 的 many-core,也不是針對多核心的 CPU,而是特別針對 CPU 的 SIMD 向量處理器,把 SPMD 的程式、用在 CPU 的向量處理器上!

如此一來,程式開發者就就不必特別去寫較低階的 SSE 指令、就可以讓程式也可以透過 CPU 上的 SIMD 向量處理器來加速計算了!而以目前這個版本來說,他支援 SSE2 和 SSE4 的指令集(AVX 以後也會支援);根據官方說法,在有 4-wide SSE 單元的 CPU 上,它經常可以將效能提升到三倍以上!而如果再搭配他的 Task Parallelism 的機制的話,在多核心系統上的效能就可以衝得更高了!

在程式的編寫上呢?Heresy 自己還沒認真研究完,不過由於架構本身就類似,所以 ispc 大致上的用法是和 CUDA / OpenCL 類似的。基本上,ispc 只有他自己的 ispc program(類似 CUDA 的 kernel、範例中副檔名是 ispc 的檔案)是要用 ispc 的編譯器來編譯的;而其他的程式碼,則是依舊使用 g 或 msvc 來做編譯、不會有問題。

而 ispc program 的 C-like 語法,基本上是在函式的參數的宣告上比較麻煩一些,但是不用像 CUDA / OpenCL 還必須要做記憶體複製的動作;而在 program 本身的語法(參考),也有一些特別的限制,不過大致上是和標準的 C 差不多了∼下面就是官方提供的簡單範例:

export void simple( uniform float vin[], uniform float vout[],
                    uniform int count)
{
// Compute the result for 'programCount' values in parallel
for (uniform int i = 0; i < count; i = programCount) {
int index = i programIndex;
// Load the appropriate input value for this program instance.
float v = vin[index];

// Do an arbitrary little computation, but at least make the
// computation dependent on the value being processed
if (v < 3.)
v = v * v;
else
v = sqrt(v);

// And write the result to the output array.
vout[index] = v;
}
}

而執行時,也就只要單純去呼叫這個函式就可以了∼不過由於 Heresy 自己也還沒研究完,在這邊也就不多加說明了。如果要自學的話,應該看完官方的簡單地 Example(網頁),就可以知道大部分該知道的東西了∼當然,要比較完整的話,就還是要去看 User’s Manual 了。

Heresy 在自己的 Core i7 950 上、搭配 VC2010 測試他的「mandelbrot」(說明)範例,效果也相當地好!

測試方法 時間(million cycles) 效能
未平行化 2450.674 100%
編譯器 SSE2 最佳化 2270.693 108%
OpenMP 627.343 391%
ISPC 455.084 539%
ISPC Tasks 107.420 2,281%

由上表可以看的出來,基本上在 Heresy 的環境下,使用 ispc 的話,效能會是沒有最佳化的 5 倍以上!這部分在有針對多核心平行化、或是沒有針對多核心平行化時,都是名有差的!而且,5X 的效率增加,也算是相當大的效能增加了∼相較於此,單純開啟編譯器的 SSE2 支援,用處就真的不大了。 ^^"

所以,如果程式的演算法本身是 data parallelism、然後又想要衝程式效能的話,看來除了 GPGPU 外,ispc 或許也是個不錯的選擇吧∼目前官網的下載頁面已經有提供 Windows、Linux、MacOS 三種平台預先編譯好的編譯器可以下載了,所以要上手相對的應該也不會太麻煩的(至少不用去編譯編譯器本身)。


附註:

  • 測試時,都是用 ispc 編譯出 SSE4 的程式(預設值),如果為了 CPU 相容性的話,也可以改用 SSE2,但是效能的增益就會從 5X 降低到 3X 左右。
  • Heresy 對於 SIMD、vector processor 這部分用詞上有的地方比較不確定,有發現問題請幫忙指正。
  • 對於 ispc 的用語定義部分,Heresy 有些地方比較不確定,再加上由於沒有把官網的資料完整看完,所以如果內容有問題的話,也請海涵了。 :p

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *