跳至內容

NVIDIA GPUDirect for Video#

Basler 支援 NVIDIA GPUDirect for Video 技術。您可以通过 Basler Framegrabber API 存取與控制 NVIDIA GPUDirect for Video 技術的使用。NVIDIA GPUDirect for Video 專為使用 NVIDIA 圖形處理器 (GPU) 的系統而設計。

此技術能夠以低延遲高效將視訊影格傳輸至 NVIDIA GPU 記憶體中。它可讓您完全掌控以子影格傳輸時間將視訊串流傳輸至 GPU。

GPUDirect for Video 技術透過執行 Windows 作業系統且位於主機 PC 上的 Basler Framegrabber API 提供,適用於

  • OpenGL (Open Graphics Library),或
  • CUDA (Compute Unified Device Architecture)(NVIDIA 推出的平行程式設計架構)。

NVIDIA GPUDirect for Video 專為使用 NVIDIA 圖形處理器 (GPU) 的系統而設計。此技術能夠以低延遲高效將視訊影格傳輸至 NVIDIA GPU 記憶體中。它可讓您完全掌控以子影格傳輸時間將視訊串流傳輸至 GPU。

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

Requirements#

若要將 GPUDirect for Video 技術與 Basler 擷取卡搭配使用,您的系統必須符合下列要求:

硬體#

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

您所選的 Basler 擷取卡。

軟體#

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

資訊

您可能需要額外的 DLL 和標頭檔才能執行 GPUDirect for Video。如需詳細資訊,請聯絡 Basler Technical Support。

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

安裝與設定#

先決條件#

  • GPU 硬體:主機 PC 上已插上支援 GPUDirect for Video 技術的 NVIDIA GPU。
  • 平行運算平台/API:主機 PC 上已安裝下列其中一個套件:
    • 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。

將檔案複製到安裝目錄中所述的子資料夾後,即可透過 Framegrabber API 使用 GPUDirect for Video 的函數。

函式參考#

您可以透過 Framegrabber API 使用 CUDA 或 OpenGL 來控制 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
描述 全域初始化。在進行任何其他初始化函數呼叫之前,請先呼叫此函數。
Parameters
  • [in] Fg_Struct* iFgHandle:
    有效擷取卡實例的控制代碼。請參閱程式庫說明文件 fglib 在 Framegrabber API 手冊中。
  • [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.
Parameters 無
功能 GDGetContextInfo
描述 呼叫。
Parameters
  • [in] GD_CONTEXT_INFO_CMD iInfoCmd:
    使用此參數來指定您想要取得的資訊。唯一可用值: GD_CONTEXT_STRIDE_LENGTH。:
    跨距長度的定義如下:當視訊影像儲存於 Memory 中時,Memory 緩衝區可能會在每一列像素之後包含額外的填補位元組。這些填補位元組會影響影像在 Memory 中的儲存方式,但不會影響影像的顯示方式。跨距是指從 Memory 中的某一列像素到下一列像素之間的位元組數。跨距也稱為間距。如果存在填補位元組,則跨距會大於影像的寬度,如以下圖示所示。包含相同尺寸視訊畫面的兩個緩衝區可以有兩個不同的跨距。如果您處理視訊影像,則必須將跨距納入考量。跨距長度:
    來源: 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
描述 從擷取引擎移除已宣告的緩衝區。此函式將釋放與此緩衝區相關聯的所有內部配置資源。只有在緩衝區未排隊於任何佇列中時,才能撤銷該緩衝區。
Parameters [in] BUFFER_HANDLE:
參照至緩衝區的 Handle。緩衝區本身已透過 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL,或 GDAnnounceBufferGL.
功能 GDStartAcquisition
描述 函式進行宣告。
Parameters 無
功能 GDStartAcquisitionEx
描述 函式進行宣告。
Parameters
  • [in] unsigned int apcTimeout:
    設定擷取引擎的逾時期間(以秒為單位)。
    Default:5 秒。
  • [in] unsigned int apcFlags:
    中指定的時間內未接收到任何影像資料,擷取引擎仍繼續執行。
    請參閱 註冊非同步模式的回呼函數 如需旗標列表,請參閱
    Default: GD_ACQUISITION_DEFAULT_FLAGS
    → 這會評估為: FG_APC_IGNORE_TIMEOUTS | FG_APC_DELIVER_ERRORS.
    旗標詳細資料:
    • FG_APC_DELIVER_ERRORS: GDGetLastError 正常運作所需。
    • FG_APC_IGNORE_TIMEOUTS:確保即使在 apcTimeout.
功能 GDStopAcquisition
描述 停止擷取引擎。
Parameters 無
功能 GDAllocateSourceBuffer
描述 此函數會為單一來源緩衝區配置記憶體,將此緩衝區宣告給擷取引擎,並傳回一個參照該單一緩衝區的緩衝區代碼 (handle)。
Parameters
  • [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*:代碼 (handle)
功能 GDRegisterEvent
描述 將事件物件註冊至特定的 iEventID.
Parameters
  • [in] EVENT_TYPE iEventID:
    可能的值:
    • EVENT_ERROR:關於模組錯誤的通知。
    • EVENT_COPY_FINISHED:關於新 Fill 之緩衝區的通知。事件資料會儲存於 EVENT_NEW_BUFFER_DATA。或者,您可以使用函數 GDMemcpy.
  • [out] EVENT_HANDLE* phEvent:
    使用此代碼透過函數取得事件 GDEventGetData.
功能 GDEventGetData
描述 從與事件代碼相關聯的事件資料佇列中擷取下一個事件資料項目。
Parameters
  • [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 類型傳送。
Parameters
  • [out] void * pBuffer:
    該值會寫入此緩衝區中。如果 pBuffer = NULL, piSize 提供緩衝區儲存所需的尺寸 EVENT_NEW_BUFFER_DATA 類型傳送。
  • [in/out] size_t * piSize:
    呼叫此函式時,您必須在此參數中定義 pBuffer 的大小。如果大小太小(對於所傳遞的緩衝區長度而言),則 size 的值會自動調整以符合緩衝區的大小。呼叫之後,此參數會保留已寫入 pBuffer.
功能 GDBufferUnblock
描述 此函式會解除封鎖用於複製程序的緩衝區。您作為下列成員收到的每個緩衝區 EVENT_NEW_BUFFER_DATA 都需要透過此函式解除封鎖(例如,以便為新的複製程序準備緩衝區)。在解除封鎖緩衝區之前,請確保您對緩衝區內容的操作已完成。
Parameters [in] BUFFER_HANDLE phBuffer
功能 GDBufferGetDataPtr
描述 此函式會傳回指向緩衝區記憶體位置起始點的指標。該緩衝區必須是使用以下項目建立的 GDAllocateSourceBuffer 函數。
Parameters
  • [in] BUFFER_HANDLE phBuffer
  • [out] void** mDataPtr :
    包含指向由此緩衝區管理的原始資料的指標。
功能 GGDGetBufferInfo
描述 使用此函式來查詢與此緩衝區代號相關聯的緩衝區模組的資訊。
Parameters
  • [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
描述 使用此函式來查詢與發生的最後一個錯誤相關聯的訊息。
Parameters
  • [out] char * pMsgBuffer:
    該值會寫入此緩衝區中。如果 pMsgBuffer = NULL, piSize 提供儲存錯誤訊息所需的緩衝區大小。
  • [in/out] size_t * piSize :
    呼叫此函式時,您必須在此參數中定義 pMsgBuffer 在此參數中。如果大小太小(對於傳遞的訊息而言),則 size 的值將自動調整以符合訊息的大小。呼叫之後,此參數包含已寫入至 pBuffer.
功能 GDAnnounceTextureGL
描述 此函式將目標物件宣告為複製操作的目的地,並傳回參照該單一緩衝區的緩衝區代號。
Parameters
  • [in]GLuint texture:
    您使用 OpenGL 建立的紋理 ID。
  • [out]BUFFER_HANDLE* handle:
    指向此緩衝區的代號。
功能 GDAnnounceBufferGL
描述 此函式將目標物件宣告為複製操作的目的地,並傳回參照該單一緩衝區的緩衝區代號。
Parameters
  • [in]GLuint buffer:
    您使用 OpenGL 建立的紋理 ID。
  • [out]BUFFER_HANDLE* handle:
    指向此緩衝區的代號。
功能 GDAnnounceCUDAArray
描述 此函式將目標物件宣告為複製操作的目的地,並傳回參照該單一緩衝區的緩衝區代號。
Parameters
  • CUarray array:
    參照您使用 CUDA 建立的緩衝區的代號。
  • BUFFER_HANDLE* handle:
    指向此緩衝區的代號。

資料類型#

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

Enumerations#

GD_CTX_LIST
GD_CTX_CUDA CUDA 內容的名稱
GD_CTX_OPENGL OpenGL context 的名稱
GD_CTX_D3D9 不支援
GD_CTX_D3D11 不支援
GD_CONTEXT_INFO_LIST
GD_CONTEXT_STRIDE_LENGTH 跨距長度:
來源: 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 關於新 Fill 的 buffer 的通知。事件資料儲存在 EVENT_NEW_BUFFER_DATA.
GD_BUFFER_INFO_LIST
GD_BUFFER_TIMESTAMP buffer 中上次變更的時間戳記
GD_BUFFER_TIMESTAMP_FREQUENCY 時間戳記的頻率
GD_BUFFER_PICNUMBER buffer 內容的索引
GD_BUFFER_DATA_PTR 指向由 buffer 管理的原始資料的指標

範例#

先決條件#

  • 您已備妥從 Basler 收到的範例資料夾。
  • 您的 PC 上已安裝 Visual Studio 15.x 或更高版本。
  • 您的 PC 上已安裝 CMake。
  • 您的 PC 上已安裝對應的函式庫。

使用範例#

若要使用 Basler 提供的範例:

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

    CUDA 範例

    對於 CUDA 範例,除了 PC 上已經安裝的函式庫之外,您只需要 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\gpudirect\opengl 設為來源目錄。

  3. 執行範例。

執行範例時,系統會要求您選取一個 applet。請選取一個灰階 applet,例如適用於 marathon frame grabber 的 Acq_SingleCXP6X4AreaGray.dll。名稱可能會被截斷,您只會看到結尾。

針對 marathon Frame Grabbers:在範例中使用灰階 Applet

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

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