在optimization guide of Beignet, an open source implementation of OpenCL targeting Intel GPUs如何充分利用OpenCL中的SIMD?
工作組大小應大於16和是多個的16
作爲根上兩個可能的SIMD通道是8或16。爲了不浪費SIMD 車道,我們需要遵循這個規則。
在Compute Architecture of Intel Processor Graphics Gen7.5還提到:
對於基於Gen7.5產品,每個EU有七個線程總共通用寄存器文件的28千字節(GRF)。
...
在Gen7.5計算架構,最SPMD編程模型採用 這種風格的代碼生成和歐盟的處理器執行。實際上, 每個SPMD內核實例似乎在其自己的SIMD通道中串行且獨立地執行。
實際上,每個線程同時執行一個SIMD寬度的內核實例數。 因此,對於計算 內核的SIMD-16編譯,可能的是SIMD-16×7個=線程112個內核實例 是在單個EU同時執行。類似地,對於SIMD-32 x 7個線程= 224個內核實例在單個的 EU上同時執行。
如果我正確理解它,使用SIMD-16 x 7 threads = 112 kernel instances
作爲示例,爲了在一個EU運行224個螺紋,工作組大小需要是16。然後OpenCL編譯器將摺疊16個內核實例爲16 SIMD線程,並在7個工作組上執行7次,並在單個EU上運行它們?
問題1:我是否正確?
但是OpenCL spec也提供矢量數據類型。因此,通過傳統的SIMD編程(如NEON和SSE)充分利用EU中的SIMD-16計算資源是可行的。
問題2:如果是這種情況,使用vector-16數據類型已經明確使用SIMD-16資源,因此刪除了每工作組至少16個項目的限制。是這樣嗎?
問題3:如果以上爲真,那麼如何兩個方法相互比較:1) 112螺紋摺疊成由OpenCL編譯7 SIMD-16線程; 2) 7個原生線程編碼爲明確使用vector-16數據類型和SIMD-16操作?