天天看點

OpenCL擴充

摘要:OpenCL擴充是指device支援某種特性,但這中特性并不是OpenCL标準的一部分。通過擴充,廠商可以給device增加一些新的功能,而不用考慮相容性問題。現在各個廠商在OpenCL的實作中或多或少的使用了自己的擴充。

1、OpenCL擴充

OpenCL擴充是指device支援某種特性,但這中特性并不是OpenCL标準的一部分。通過擴充,廠商可以給device增加一些新的功能,而不用考慮相容性問題。現在各個廠商在OpenCL的實作中或多或少的使用了自己的擴充。

擴充的類型分為三種:

  • Khronos OpenCL工作組準許的擴充,這種要經過一緻性測試,可能會被增加到新版本的OpenCL規範中。這種擴充都以cl_khr作為擴充名。
  • 外部擴充, 以cl_ext為擴充名。這種擴充是由2個或2個以上的廠商發起,并不需要進行一緻性測試。比如cl_ext_device_fission擴充。
  • 某個廠商自己的擴充,比如AMD的擴充printf

2、使用擴充

OpenCL中,要使用擴充,我們必須打開擴充,在預設狀态下,所有的擴充都是禁止的。

       #pragma OPENCL EXTENSION extension_name : enable

對于OpenCL,一個函數隻有在運作時,才知道其是否可用,是以要确定某個擴充是否可用,是程式員的責任,我們必須在使用前查詢它的狀态。下面是查詢擴充是否可用的代碼:

OpenCL擴充

3、一些Khronos準許的擴充

原子操作,它可以保證函數隻在一個device上實施原子操作,比如:

—cl_khr_{global | local}_int32_base_atomics

—cl_khr_{global | local}_int32_extended_atomics

—cl_khr_int64_base_atomics

—cl_khr_int64_extended_atomics

注意:原子操作能夠保證操作結果正确,但不保證操作的順序。

OpenCL擴充
OpenCL擴充

雙精度和half精度擴充cl_khr_fp64,在一些實體模拟或者科學計算中,需要雙精度支援。AMD的64位擴充用cl_amd_fp64,對于cl_khr_fp64是部分支援,NV支援cl_khr_fp64擴充。但half精度擴充cl_khr_fp16,這兩家廠商現在都還不支援。

在OpenCL中,Byte addressable store 也是一個擴充,對于sub 32的寫,比如char,需要該擴充的支援。例如AMD 直方圖的例子中,每個bin用一個byte來存儲。

3D Image Write Extensions,在OpenCL标準中,支援2D圖像的讀寫,3D圖形的寫就需要通過擴充來操作。

The extension cl_KHR_gl_sharing 允許應用程式使用OpenGL buffer,紋理等。

4、AMD擴充

cl_ext_device_fission擴充,通過該擴充把一個裝置分成多個子裝置,每一個裝置都有自己的隊列,主要是多核cpu以及Cell Broadband Engine使用,該擴充由AMD,Apple,Intel以及IBM四家聯合提出。

fission裝置可能的用途包括:

  • 保留一部分裝置處理高優先級、低延遲時間的任務。
  • Control for the assignment of work to individual compute units
  • Subdivide compute devices along some shared hardware feature like a cache

對于每個子裝置,都有自己的queue,比如下面的圖中,我們把不同任務發送到兩個子裝置。值得注意的是:要把裝置拆分為子裝置,首先我們要了解該裝置的架構,然後根據任務及device架構進行拆分。

OpenCL擴充

GPU printf 擴充,主要用來debug kernel代碼。cl_amd_media_ops擴充,主要用于一些多媒體操作。The AMD device query extension 主要用于查詢和事件處理。

5、NV擴充

  • Compiler Options
  • Interoperability Extensions
  • Device Query Extension

6、Cell Broadband Engine Extensions

cell處理器用的不多,就不詳細說了,使用的人可以查詢其相關手冊。

原文作者:邁克老狼

繼續閱讀