跳至內容

NVIDIA GPUDirect for Video#

Basler 支援 NVIDIA GPUDirect for Video 技術。你可以透過 Basler Framegrabber API 存取與控制 NVIDIA GPUDirect for Video 技術的使用。NVIDIA GPUDirect for Video 專為使用 NVIDIA 圖形處理單元 (GPU) 的系統量身打造。

該技術允許以低延遲將視訊影格有效率地傳輸到 NVIDIA GPU Memory 中。它讓你能完整控制以次影格傳輸時間將視訊串流至 GPU。

GPUDirect for Video 技術透過 Basler Framegrabber API 提供給使用 Windows 作業系統的主機 PC,並在

  • OpenGL (Open Graphics Library),或
  • CUDA (Compute Unified Device Architecture) 中運作,這是 NVIDIA 的平行程式設計框架。

NVIDIA GPUDirect for Video 專為使用 NVIDIA 圖形處理單元 (GPU) 的系統量身打造。該技術允許以低延遲將視訊影格有效率地傳輸到 NVIDIA GPU Memory 中。它讓你能完整控制以次影格傳輸時間將視訊串流至 GPU。

如需詳細資訊,請參閱製造商網站的 NVIDIA GPUDirect for Video technology 與 GPUDirect Technology Overview 章節。

要求#

若要在結合 Basler 擷取卡的系統上使用 GPUDirect for Video 技術,你的系統必須符合下列需求:

硬體#

如需支援的 NVIDIA GPU 最新清單,請參閱這裡。

你選擇的 Basler 擷取卡。

軟體#

  • Basler Framegrabber SDK:版本 5.10.0 或更高版本
  • 主機電腦作業系統:Windows 10 (64-bit)
  • 平行計算平台/API(請參閱 安裝):
    • CUDA (Compute Unified Device Architecture) 11.6 版,或
    • OpenGL (Open Graphics Library)
  • 建議的 IDE:Visual Studio 15.x 或更高版本

資訊

您可能需要額外的 DLL 與標頭檔才能執行 GPUDirect for Video。如需詳細資訊,請聯絡 Basler 技術支援。

GPUDirect for Video 技術的支援已在 Windows 10 下進行過測試,且保證在此 Windows 版本上可用。

安裝#

先決條件#

  • GPU 硬體:您的主機電腦已安裝支援 GPUDirect for Video 技術的 NVIDIA GPU。
  • 平行運算平台/API:您的主機電腦已安裝以下其中一個套件:
    • CUDA (Compute Unified Device Architecture),NVIDIA 推出的平行程式設計框架
    • OpenGL (Open Graphics Library)
  • 擷取卡硬體:您選擇的 Basler 擷取卡已連接至主機 PC。如需如何連接擷取卡的資訊,請參閱連接擷取卡。
  • Framegrabber SDK:已安裝 Basler Framegrabber SDK 5.10.0 或更高版本。如需如何安裝執行階段軟體的資訊,請參閱安裝 Framegrabber SDK。
  • Applet:您選擇的 Applet 已燒錄至您的擷取卡(僅適用於 marathon 擷取卡)並被選為作用中的 Applet。如需如何燒錄 marathon 擷取卡的資訊,請參閱燒錄。如需如何將 Applet 選為作用中 Applet 的資訊,請參閱變更作用中的 Applet。
  • GPUDirect for Video 支援檔案:Basler 提供下列檔案:
    • siso_gpudirect.dll:函式庫檔案
    • siso_gpudirect.h:涵蓋隨時所需一般功能的標頭檔
    • siso_gpudirect_cuda.h:使用 CUDA 工作所需的標頭檔
    • siso_gpudirect_gl.h:在 OpenGL 中工作所需的標頭檔。

安裝 GPUDirect for Video 支援#

若要在主機 PC 上安裝 GPUDirect for Video 支援:

  1. 將函式庫檔案 siso_gpudirect.dll 複製到 Basler Framegrabber SDK 安裝目錄下的 bin 子資料夾中,例如 C:\Program Files\Basler\FramegrabberSDK_5.XX.X\bin。
  2. 將標頭檔複製到 Basler Framegrabber SDK 安裝目錄的 include 子資料夾中,例如 C:\Program Files\Basler\FramegrabberSDK_5.XX.X\include。

將檔案複製到安裝的上述子資料夾後,您就可以透過 Basler Framegrabber API 使用 GPUDirect for Video 的功能。

函數參考#

您可以使用 CUDA 或 OpenGL 來透過 Framegrabber API 控制 GPUDirect for Video。

使用 CUDA 的先決條件#

  • 函式庫檔案 siso_gpudirect.dll 已複製到 Framegrabber SDK 安裝的 bin 子資料夾中。
  • 標頭檔 siso_gpudirect.h 與 siso_gpudirect_cuda.h 已複製到 Framegrabber SDK 安裝的 include 子資料夾中。

使用 OpenGL 的先決條件#

  • 函式庫檔案 siso_gpudirect.dll 已複製到 Framegrabber SDK 安裝的 bin 子資料夾中。
  • 標頭檔 siso_gpudirect.h 與 siso_gpudirect_gl.h 已複製到 Framegrabber SDK 安裝的 include 子資料夾中。

可用功能#

透過 Framegrabber API 控制 GPUDirect for Video 技術的函式,在 CUDA 與 OpenGL 中是相同的。Framegrabber API 提供下列函式:

功能 GDInitLib
描述 全域初始化。在任何其他初始化函式之前呼叫此函式。
參數
  • [in] Fg_Struct* iFgHandle:
    有效擷取卡實例的代碼。請參閱函式庫說明文件 fglib 請參閱 Framegrabber API Manual。
  • [in] GD_CONTEXT iFlag:
    在此定義您要使用的技術。可能的值 (GD_CTX_LIST):
    • GD_CTX_CUDA:表示與 CUDA 一起使用
    • GD_CTX_OPENGL:表示與 OpenGL 一起使用
    • GD_CTX_D3D9:不支援
    • GD_CTX_D3D11:不支援
功能 GDCloseLib
描述 當不再需要該程式庫的任何功能時,您必須呼叫此函式以清除來自 GDInitLib 函式呼叫。每次呼叫 GCCloseLib 的資源,且必須伴隨先前的呼叫 GDInitLib.
參數 無
功能 GDGetContextInfo
描述 使用此函式來取得有關目前 Context 的資訊。
參數
  • [in] GD_CONTEXT_INFO_CMD iInfoCmd:
    使用此參數來指定您要取得的資訊。唯一可用值: GD_CONTEXT_STRIDE_LENGTH. :
    Stride Length 的定義如下:將視訊影像儲存在 Memory 中時,Memory Buffer 可能會在每一列像素之後包含額外的填充位元組。填充位元組會影響影像在 Memory 中的儲存方式,但不會影響影像的顯示方式。Stride 是指 Memory 中從某一列像素到下一列像素的位元組數。Stride 也稱為 Pitch。如果存在填充位元組,則 Stride 會比影像寬度更寬,如以下圖示所示。包含相同尺寸視訊畫面的兩個 Buffer 可以具有兩個不同的 Stride。如果您處理視訊影像,則必須將 Stride 納入考量。Stride Length:
    Source: https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx:
    請確保您定義的影像尺寸符合填充限制。
  • [out] void * pBuffer<:/br>The information provided (i.e. input value), for example, the value of the stride length, is written into this buffer. If pBuffer = NULL, piSize 提供緩衝區為了能夠儲存該資訊(即輸出值)所需的尺寸大小。
  • [in/out] size_t * piSize:
    呼叫此函式時,您必須定義 pBuffer 在此參數中。如果尺寸大小太小(針對所傳遞之緩衝區的長度),則下列的值 size 的大小,其會自動調整以符合緩衝區的大小。呼叫之後,此參數會保留已寫入 pBuffer.
功能 GDRevokeBuffer
描述 從擷取引擎中移除已宣告的 Buffer。此函式將釋放與此 Buffer 相關的所有內部配置資源。只有在 Buffer 未排入任何 Queue 中時,才能撤銷該 Buffer。
參數 [in] BUFFER_HANDLE:
指向該 Buffer 的 Handle。Buffer 本身已透過函式 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL或 GDAnnounceBufferGL.
功能 GDStartAcquisition
描述 啟動擷取引擎。
參數 無
功能 GDStartAcquisitionEx
描述 啟動擷取引擎。
參數
  • [in] unsigned int apcTimeout:
    設定擷取引擎的逾時時間(以秒為單位)。
    Default: 5 秒。
  • [in] unsigned int apcFlags:
    用於啟用或停用擷取引擎特定功能的旗標 (Flags)。
    請參閱 為非同步模式註冊回呼函式 以取得旗標 (Flags) 清單。
    Default: GD_ACQUISITION_DEFAULT_FLAGS
    → 這會計算得出: FG_APC_IGNORE_TIMEOUTS | FG_APC_DELIVER_ERRORS.
    旗標 (Flags) 詳細資訊:
    • FG_APC_DELIVER_ERRORS中的位元組數: GDGetLastError 才能正常運作。
    • FG_APC_IGNORE_TIMEOUTS:確保擷取引擎持續運轉,即使在 apcTimeout.
功能 GDStopAcquisition
描述 停止擷取引擎。
參數 無
功能 GDAllocateSourceBuffer
描述 此函式會為單一來源 Buffer 配置 Memory、向擷取引擎宣告此 Buffer,並傳回參考該單一 Buffer 的 Buffer Handle。
參數
  • [in] uint32_t width: 影像寬度
  • [in] uint32_t height:影像高度
  • [in] GDBufferTypes type:使用此參數來定義 Pixel Format。可能的值:
    • GD_UNSIGNED_BYTE
    • GD_BYTE
    • GD_UNSIGNED_SHORT
    • GD_SHORT
    • GD_UNSIGNED_INT
    • GD_INT
    • GD_FLOAT
    • GD_HALF_FLOAT
    • GD_UNSIGNED_BYTE_3_3_2
    • GD_UNSIGNED_BYTE_2_3_3_REV
    • GD_UNSIGNED_SHORT_5_6_5
    • GD_UNSIGNED_SHORT_5_6_5_REV
    • GD_UNSIGNED_SHORT_4_4_4_4
    • GD_UNSIGNED_SHORT_4_4_4_4_REV
    • GD_UNSIGNED_SHORT_5_5_5_1
    • GD_UNSIGNED_SHORT_1_5_5_5_REV
    • GD_UNSIGNED_INT_8_8_8_8
    • GD_UNSIGNED_INT_8_8_8_8_REV
    • GD_UNSIGNED_INT_10_10_10_2
    • GD_UNSIGNED_INT_2_10_10_10_REV
  • [out] BUFFER_HANDLE*:控制代碼
功能 GDRegisterEvent
描述 將事件物件註冊至特定的 iEventID.
參數
  • [輸入] EVENT_TYPE iEventID:
    可能的值:
    • EVENT_ERROR:模組錯誤通知。
    • EVENT_COPY_FINISHED: 關於新 Fill 的緩衝區通知。事件資料儲存在 EVENT_NEW_BUFFER_DATA或者,您可以使用此函式 GDMemcpy.
  • [out] EVENT_HANDLE* phEvent:
    請使用此控制代碼透過函數取得事件 GDEventGetData.
功能 GDEventGetData
描述 從與事件控制代碼相關聯的事件資料佇列中擷取下一個事件資料項目。
參數
  • [in] EVENT_HANDLE phEvent:
    您已經透過函數建立此控制代碼 GDRegisterEvent.
  • [out] void * pBuffer:
    提供的資訊(即輸出值)會寫入此緩衝區中。如果 pBuffer = NULL, piSize 提供緩衝區為了能夠儲存該資訊(即輸出值)所需的尺寸大小。
  • [in/out] size_t * piSize:
    呼叫此函式時,您必須定義 pBuffer 在此參數中。如果尺寸大小太小(針對所傳遞之緩衝區的長度),則下列的值 size 的大小,其會自動調整以符合緩衝區的大小。呼叫之後,此參數會保留已寫入 pBuffer.
  • [in] uint64_t iTimeout<:/br/> The function doesn't deliver any output until the time-out is over (in this case, the function returns state GD_ERR_TIMEOUT ),或直到指定的事件發生。
功能 GDMemcpy
描述 將畫面擷取卡傳送的下一幀畫面複製到 GPU 中。如果您想觸發複製程序,請使用此函數。結果會以 EVENT_NEW_BUFFER_DATA 類型。
參數
  • [out] void * pBuffer:
    該值會寫入此緩衝區中。如果 pBuffer = NULL, piSize 提供緩衝區儲存所需的記憶體大小,以便能夠儲存 EVENT_NEW_BUFFER_DATA 類型。
  • [in/out] size_t * piSize:
    呼叫此函式時,您必須定義 pBuffer 在此參數中。如果尺寸大小太小(針對所傳遞之緩衝區的長度),則下列的值 size 的大小,其會自動調整以符合緩衝區的大小。呼叫之後,此參數會保留已寫入 pBuffer.
功能 GDBufferUnblock
描述 此函數會解除封鎖用於複製程序的緩衝區。您作為以下成員收到的每個緩衝區 EVENT_NEW_BUFFER_DATA 都需要透過此函數解除封鎖(例如,以便為新的複製程序準備緩衝區)。在解除封鎖緩衝區之前,請確保您對緩衝區內容的操作已完成。
參數 [in] BUFFER_HANDLE phBuffer
功能 GDBufferGetDataPtr
描述 此函數傳回指向緩衝區記憶體位置起始點的指標。該緩衝區必須已使用 GDAllocateSourceBuffer 函式搭配使用。
參數
  • [in] BUFFER_HANDLE phBuffer
  • [out] void** mDataPtr :
    包含指向由此緩衝區管理的原始資料的指標。
功能 GGDGetBufferInfo
描述 使用此函數查詢與此緩衝區控制代碼相關聯的緩衝區模組的資訊。
參數
  • [in] BUFFER_HANDLE hBuffer
  • [in] GD_BUFFER_INFO_CMD iInfoCmd:
    可能的值:
    • GD_BUFFER_TIMESTAMP:緩衝區中最後變更的時間戳記。
    • GD_BUFFER_TIMESTAMP_FREQUENCY: 時間戳記頻率。
    • GD_BUFFER_PICNUMBER:緩衝區內容的索引。
    • GD_BUFFER_DATA_PTR: 指向由緩衝區管理的原始資料的指標。
  • [out] void * pBuffer:
    該值會寫入此緩衝區中。如果 pBuffer = NULL, piSize 提供緩衝區儲存資料所需的尺寸。
  • [in/out] size_t * piSize :
    呼叫此函式時,您必須定義 pBuffer 在此參數中。如果尺寸太小(對於所傳遞的緩衝區長度),尺寸值會自動調整以符合緩衝區的大小。呼叫後,此參數會保留已寫入 pBuffer.
功能 GDGetLastError
描述 使用此函數查詢與發生的最後一個錯誤相關聯的訊息。
參數
  • [out] char * pMsgBuffer:
    該值會寫入此緩衝區中。如果 pMsgBuffer = NULL, piSize 提供緩衝區所需的尺寸,以便能夠儲存錯誤訊息。
  • [in/out] size_t * piSize :
    呼叫此函式時,您必須定義 pMsgBuffer 在此參數中。如果尺寸太小(對於傳遞的訊息),則 size 的值會自動調整以符合訊息尺寸。呼叫後,此參數會保留已寫入 pBuffer.
功能 GDAnnounceTextureGL
描述 此函數將目標物件宣告為複製操作的目的地,並傳回參考該單一緩衝區的緩衝區控制代碼。
參數
  • [in]GLuint texture:
    您使用 OpenGL 建立的紋理 ID。
  • [out]BUFFER_HANDLE* handle:
    指向此緩衝區的控制代碼。
功能 GDAnnounceBufferGL
描述 此函數將目標物件宣告為複製操作的目的地,並傳回參考該單一緩衝區的緩衝區控制代碼。
參數
  • [in]GLuint buffer:
    您使用 OpenGL 建立的紋理 ID。
  • [out]BUFFER_HANDLE* handle:
    指向此緩衝區的控制代碼。
功能 GDAnnounceCUDAArray
描述 此函數將目標物件宣告為複製操作的目的地,並傳回參考該單一緩衝區的緩衝區控制代碼。
參數
  • CUarray array:
    參考您使用 CUDA 建立的緩衝區的控制代碼。
  • BUFFER_HANDLE* handle:
    指向此緩衝區的控制代碼。

資料類型#

STRUCT 名稱 EVENT_NEW_BUFFER_DATA
描述 事件已將來源緩衝區的內容複製到目標緩衝區中。
參數
  • BUFFER_HANDLE SourceBufferHandle:
    您已透過函數建立此緩衝區 GDAllocateSourceBuffer.
  • BUFFER_HANDLE TargetBufferHandle:
    您已透過函數建立此緩衝區 GDAnnounceCUDAArray (CUDA),或透過函數 GDAnnounceTextureGL 或 PGDAnnounceBufferGL (OpenGL)。

Enumerations#

GD_CTX_LIST
GD_CTX_CUDA CUDA context 名稱
GD_CTX_OPENGL OpenGL context 的名稱
GD_CTX_D3D9 不支援
GD_CTX_D3D11 不支援
GD_CONTEXT_INFO_LIST
GD_CONTEXT_STRIDE_LENGTH Stride Length:
Source: https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx
GDBufferTypes
GD_UNSIGNED_BYTE
GD_BYTE
GD_UNSIGNED_SHORT
GD_SHORT
GD_UNSIGNED_INT
GD_INT
GD_FLOAT
GD_HALF_FLOAT
GD_UNSIGNED_BYTE_3_3_2
GD_UNSIGNED_BYTE_2_3_3_REV
GD_UNSIGNED_SHORT_5_6_5
GD_UNSIGNED_SHORT_5_6_5_REV
GD_UNSIGNED_SHORT_4_4_4_4
GD_UNSIGNED_SHORT_4_4_4_4_REV
GD_UNSIGNED_SHORT_5_5_5_1
GD_UNSIGNED_SHORT_1_5_5_5_REV
GD_UNSIGNED_INT_8_8_8_8
GD_UNSIGNED_INT_8_8_8_8_REV
GD_UNSIGNED_INT_10_10_10_2
GD_UNSIGNED_INT_2_10_10_10_REV
EVENT_TYPE_LIST
EVENT_ERROR 模組錯誤的通知。
EVENT_COPY_FINISHED 關於新填入緩衝區的通知。事件資料儲存在 EVENT_NEW_BUFFER_DATA.
GD_BUFFER_INFO_LIST
GD_BUFFER_TIMESTAMP 緩衝區最後變更的時間戳記
GD_BUFFER_TIMESTAMP_FREQUENCY 時間戳記頻率
GD_BUFFER_PICNUMBER 緩衝區內容的索引
GD_BUFFER_DATA_PTR 指向由緩衝區管理的原始資料的指標

範例#

先決條件#

  • 您可以使用從 Basler 取得的範例資料夾。
  • 您的 PC 上已安裝 Visual Studio 15.x 或更高版本。
  • 您的 PC 上已安裝 CMake。
  • 您的 PC 上已安裝相應的庫。

使用範例#

若要使用 Basler 提供的範例:

  1. 將從 Basler 取得的範例資料夾複製到主機 PC 的硬碟上。

    CUDA 範例

    對於 CUDA 範例,除了電腦上已安裝的程式庫之外,您只需要 cuda.lib 與 cudart.lib。

    OpenGL 範例:CMake 必須能夠找到 glew

    請確保 CMake 可以找到 glew,否則專案將無法正確建置。

    CMake 應能自動找到 glew。但是,如果未找到 glew:

    1. 設定對應的環境變數:

      GLUT_ROOT_PATH 例如到 D:\libs\freeglut-2.8.1\win32

      GLEW_ROOT_PATH 例如到 D:\libs\glew-1.13.0\glew-1.13.0\Win32

    2. 如果 CMake 仍然無法找到 glew,請手動設定 CMake 專案變數:

      GLEW_INCLUDE_DIR 例如到 D:/libs/glew-1.13.0/glew-1.13.0/x64/include

      GLEW_LIBRARY 例如到 D:/libs/glew-1.13.0/glew-1.13.0/x64/lib/glew32.lib

      OPENGL_gl_LIBRARY 例如到 opengl32

      OPENGL_glu_LIBRARY 例如到 glu32

  2. 使用 CMake 建立專案,並將 examples\gpudirect\cuda 或 examples\gpudregator\opengl 設為原始目錄。

  3. 執行範例。

執行範例時,系統會要求您選擇一個 Applet。請選擇灰階 Applet,例如針對 marathon frame grabber 的 Acq_SingleCXP6X4AreaGray.dll。名稱可能會被部分截斷,您只會看到結尾。

對於 marathon 採集卡:範例請使用灰階 Applet

Basler NVIDIA GPUDirect for Video 支援功能同時適用於 Color Format 與灰階格式。

不過,由於這兩個範例皆設計用於灰階 Applet,請務必選擇灰階 Applet 來執行範例,例如 Acq_SingleCXP6X4AreaGray.dll(僅適用於 marathon frame grabbers)。