コンテンツにスキップ

NVIDIA GPUDirect for Video#

BaslerはNVIDIA GPUDirect for Videoテクノロジーをサポートしています。NVIDIA GPUDirect for Videoテクノロジーの使用へのアクセスおよびその制御は、Basler Framegrabber APIを介して行うことができます。NVIDIA GPUDirect for Videoは、NVIDIAグラフィックス処理ユニット(GPU)を使用するシステム向けに調整されています。

このテクノロジーにより、ビデオフレームを低レイテンシでNVIDIA GPUメモリに効率的に転送できます。サブフレームの転送時間でビデオをGPUにストリーミングするための完全な制御が可能になります。

GPUDirect for Videoテクノロジーは、Windows OSを使用するホストPC上のBasler Framegrabber APIを通じて利用できます。

  • OpenGL(Open Graphics Library)、または
  • CUDA(NVIDIAによる並列プログラミングフレームワークであるCompute Unified Device Architecture)。

NVIDIA GPUDirect for Videoは、NVIDIAグラフィックス処理ユニット(GPU)を使用するシステム向けに調整されています。このテクノロジーにより、ビデオフレームを低レイテンシでNVIDIA GPUメモリに効率的に転送できます。サブフレームの転送時間でビデオをGPUにストリーミングするための完全な制御が可能になります。

詳細については、メーカーサイトのNVIDIA GPUDirect for Video technologyおよびGPUDirect Technology Overviewのセクションを参照してください。

要件#

Baslerフレームグラバーと組み合わせてGPUDirect for Videoテクノロジーを使用するには、システムが次の要件を満たしている必要があります。

ハードウェア#

サポートされているNVIDIA GPUの最新リストについては、こちらを参照してください。

お好みのBaslerフレームグラバー。

ソフトウェア#

  • Basler Framegrabber SDK:バージョン5.10.0以降
  • ホストPCのオペレーティングシステム:Windows 10(64bit)
  • 並列コンピューティングプラットフォーム/API(次を参照: インストール:
    • CUDA(Compute Unified Device Architecture)バージョン11.6、または
    • OpenGL(Open Graphics Library)
  • 推奨IDE:Visual Studio 15.x以降

情報

GPUDirect for Videoを実行するには、追加のDLLおよびヘッダーファイルが必要になる場合があります。詳細については、Baslerテクニカルサポートにお問い合わせください。

GPUDirect for VideoテクノロジーのサポートはWindows 10でテストされており、このWindowsバージョンでの動作が保証されます。

インストール#

前提条件#

  • GPUハードウェア:GPUDirect for VideoテクノロジーをサポートするNVIDIA GPUがホストPCに装着されています。
  • Parallel Computing Platform/API:以下のパッケージのいずれかがホストPCにインストールされていること:
    • CUDA(Compute Unified Device Architecture):Nvidiaによる並列プログラミングフレームワーク
    • OpenGL(Open Graphics Library)
  • フレームグラバーハードウェア:お好みのBaslerフレームグラバーがホストPCに接続されていること。フレームグラバーの接続方法については、フレームグラバーの接続を参照してください。
  • Framegrabber SDK:Basler Framegrabber SDK 5.10.0以降がインストールされていること。ランタイムソフトウェアのインストール方法については、Framegrabber SDKのインストールを参照してください。
  • アップレット:お好みのアップレットがフレームグラバーにフラッシュされ(marathonフレームグラバーのみ)、アクティブアップレットとして選択されていること。marathonフレームグラバーのフラッシュ方法については、フラッシングを参照してください。アップレットをアクティブアップレットとして選択する方法については、アクティブアップレットの変更を参照してください。
  • 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の機能を使用できます。

Function Reference#

Basler Framegrabber APIを介してGPUDirect for Videoを制御するには、CUDAまたはOpenGLのいずれかを使用します。

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 にコピーされました。

利用可能な関数#

Basler Framegrabber API を介して GPUDirect for Video テクノロジーを制御するための関数は、CUDA と OpenGL で共通です。Basler Framegrabber API では、次の関数を提供しています:

機能 GDInitLib
説明 グローバル初期化。初期化のために他のどの関数よりも先にこの関数を呼び出します。
パラメーター
  • [in] Fg_Struct* iFgHandle:
    有効なフレームグラバーインスタンスのハンドル。ライブラリのドキュメントを参照してください fglib Framegrabber API Manualを参照してください。
  • [in] GD_CONTEXT iFlag:
    ここで使用するテクノロジーを定義します。設定可能な値 (GD_CTX_LIST):
    • GD_CTX_CUDACUDA での使用を示します
    • GD_CTX_OPENGLOpenGL での使用を示します
    • GD_CTX_D3D9サポートされていません
    • GD_CTX_D3D11サポートされていません
機能 GDCloseLib
説明 ライブラリのどの関数も不要になったら、この関数を呼び出して次のリソースを解放する必要があります。 GDInitLib 関数呼び出し。の各呼び出しには、 GCCloseLib 先行する呼び出しが伴う必要があります。 GDInitLib.
パラメーター None
機能 GDGetContextInfo
説明 現在のコンテキストに関する情報を取得するには、この関数を使用します。
パラメーター
  • [in] GD_CONTEXT_INFO_CMD iInfoCmd:
    取得する情報を指定するには、このパラメータを使用します。利用可能な値: GD_CONTEXT_STRIDE_LENGTH.:
    ストライド長は次のように定義されます。ビデオ画像がメモリに保存されるとき、メモリバッファにはピクセルの各行の末尾に追加のパディングバイトが含まれる場合があります。パディングバイトは画像がメモリに保存される方法には影響しますが、画像の表示方法には影響しません。ストライドとは、メモリ上のピクセルのある行から次の行までのバイト数です。ストライドはピッチとも呼ばれます。パディングバイトが存在する場合、次の図に示すように、ストライドは画像の幅よりも広くなります。同じ寸法のビデオフレームを含む2つのバッファでも、ストライドが異なる場合があります。ビデオ画像を処理する場合は、ストライドを考慮する必要があります。ストライド長:
    ソース: 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
説明 取得エンジンからアナウンス済みバッファを削除します。この関数は、このバッファに関連付けられている内部で割り当てられたすべてのリソースを解放します。バッファがどのキューにも登録されていない場合にのみ、取り消すことができます。
パラメーター [in] BUFFER_HANDLE:
バッファを参照するためのハンドル。バッファ自体は次の関数を介してアナウンスされています。 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL、または GDAnnounceBufferGL.
機能 GDStartAcquisition
説明 取得エンジンを開始します。
パラメーター None
機能 GDStartAcquisitionEx
説明 取得エンジンを開始します。
パラメーター
  • [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
説明 取得エンジンを停止します。
パラメーター None
機能 GDAllocateSourceBuffer
説明 この関数は、単一のソースバッファ用のメモリを割り当て、このバッファを取得エンジンにアナウンスし、その単一のバッファを参照するバッファハンドルを返します。
パラメーター
  • [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)。

列挙#

GD_CTX_LIST
GD_CTX_CUDA CUDAコンテキストの名前
GD_CTX_OPENGL OpenGLコンテキストの名前
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 されたバッファに関する通知。イベントデータは以下に格納されます: EVENT_NEW_BUFFER_DATA.
GD_BUFFER_INFO_LIST
GD_BUFFER_TIMESTAMP バッファ内の最後の変更のタイムスタンプ
GD_BUFFER_TIMESTAMP_FREQUENCY タイムスタンプの周波数
GD_BUFFER_PICNUMBER バッファコンテンツのインデックス
GD_BUFFER_DATA_PTR バッファによって管理されるローデータへのポインタ

例#

前提条件#

  • Baslerから提供されたサンプルフォルダーを利用できます。
  • Visual Studio 15.x以降がPCにインストールされていること。
  • CMakeがPCにインストールされていること。
  • 対応するライブラリが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. ソースディレクトリとして examples\gpudirect\cuda または examples\gpudirect\opengl を指定し、CMakeを使用してプロジェクトを作成します。

  3. サンプルを実行します。

サンプルの実行中にアプレットの選択を求められます。たとえば、marathon フレームグラバー用の Acq_SingleCXP6X4AreaGray.dll などのグレースケールアプレットを選択してください。名前が途中で切れて末尾のみが表示される場合があります。

marathonフレームグラバーの場合: サンプルにはグレースケールアプレットを使用する

Basler NVIDIA GPUDirect for Videoサポートは、カラーフォーマットおよびグレースケールフォーマットの両方で機能します。

ただし、両方のサンプルともグレースケールアプレットでの使用を想定して設計されているため、サンプルを使用する際は必ずグレースケールアプレット(marathon フレームグラバー用の Acq_SingleCXP6X4AreaGray.dll など)を選択してください。