适用于视频的 NVIDIA GPUDirect#
该技术允许以低延迟高效地将视频帧传输到 NVIDIA GPU Memory 中。它赋予您完全的控制权,能够以子帧传输时间将视频流式传输到 GPU 中。
GPUDirect for Video 技术可通过宿主机 PC 上的 Basler Framegrabber API 获取,运行 Windows OS,并且在
- 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 章节。
要求#
要将 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。有关如何连接采集卡的详细信息,请参阅 Connecting the Frame Grabber。
- Framegrabber SDK:已安装 Basler Framegrabber SDK 5.10.0 或更高版本。有关如何安装运行时软件的信息,请参阅 Installing the Framegrabber SDK。
- Applet:您选择的 applet 已烧录到采集卡中(仅适用于 marathon 采集卡)并被选为活动 applet。有关如何烧录 marathon 采集卡的详细信息,请参阅 Flashing。有关如何将某个 applet 选择为活动 applet 的详细信息,请参阅 Changing the Active 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 支持:
- 将库文件 siso_gpudirect.dll 复制到 Basler Framegrabber SDK 安装目录下的 bin 子文件夹中,例如 C:\Program Files\Basler\FramegrabberSDK_5.XX.X\bin。
- 将头文件复制到 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 |
|---|---|
| 描述 | 全局初始化。在进行任何其他初始化函数调用之前,请先调用此函数。 |
| 参数 |
|
| 功能 | GDCloseLib |
|---|---|
| 描述 | 当不再需要库中的任何功能时,必须调用此函数来清理资源。 GDInitLib 函数调用。每次调用 GCCloseLib 必须事先拨打电话 GDInitLib. |
| 参数 | 无 |
| 功能 | GDGetContextInfo |
|---|---|
| 描述 | 使用此函数可以获取有关当前上下文的信息。 |
| 参数 |
|
| 功能 | GDRevokeBuffer |
|---|---|
| 描述 | 从采集引擎中移除已声明的缓冲区。此函数将释放与该缓冲区关联的所有内部分配资源。只有当缓冲区未在任何队列中排队时,才能撤销该缓冲区。 |
| 参数 | [in] BUFFER_HANDLE:处理对缓冲区的引用。缓冲区本身已通过函数声明。 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL或 GDAnnounceBufferGL. |
| 功能 | GDStartAcquisition |
|---|---|
| 描述 | 启动采集引擎。 |
| 参数 | 无 |
| 功能 | GDStartAcquisitionEx |
|---|---|
| 描述 | 启动采集引擎。 |
| 参数 |
|
| 功能 | GDStopAcquisition |
|---|---|
| 描述 | 停止采集引擎。 |
| 参数 | 无 |
| 功能 | GDAllocateSourceBuffer |
|---|---|
| 描述 | 此函数为单个源缓冲区分配 Memory,将该缓冲区声明给采集引擎,并返回一个引用该单个缓冲区的缓冲区句柄。 |
| 参数 |
|
| 功能 | GDRegisterEvent |
|---|---|
| 描述 | 将事件对象注册到特定的 iEventID. |
| 参数 |
|
| 功能 | GDEventGetData |
|---|---|
| 描述 | 从与事件句柄关联的事件数据队列中检索下一个事件数据条目。 |
| 参数 |
|
| 功能 | GDMemcpy |
|---|---|
| 描述 | 将采集卡传输的下一帧复制到 GPU 中。如果要触发复制过程,请使用此函数。结果以 EVENT_NEW_BUFFER_DATA 类型交付。 |
| 参数 |
|
| 功能 | GDBufferUnblock |
|---|---|
| 描述 | 此函数取消对复制过程缓冲区的阻塞。您作为以下成员收到的每个缓冲区 EVENT_NEW_BUFFER_DATA 都需要通过此函数解除阻塞(例如,以便为新的复制过程提供缓冲区)。在解除缓冲区阻塞之前,请确保您对缓冲区内容的操作已完成。 |
| 参数 | [in] BUFFER_HANDLE phBuffer |
| 功能 | GDBufferGetDataPtr |
|---|---|
| 描述 | 此函数返回指向缓冲区 Memory 位置起点的指针。该缓冲区必须已使用 GDAllocateSourceBuffer 函数创建。 |
| 参数 |
|
| 功能 | GGDGetBufferInfo |
|---|---|
| 描述 | 使用此函数可查询与此缓冲区句柄关联的缓冲区模块的信息。 |
| 参数 |
|
| 功能 | GDGetLastError |
|---|---|
| 描述 | 使用此函数可查询与发生的最后一个错误关联的错误消息。 |
| 参数 |
|
| 功能 | GDAnnounceTextureGL |
|---|---|
| 描述 | 此函数将目标对象声明为复制操作的目标,并返回引用该单个缓冲区的缓冲区句柄。 |
| 参数 |
|
| 功能 | GDAnnounceBufferGL |
|---|---|
| 描述 | 此函数将目标对象声明为复制操作的目标,并返回引用该单个缓冲区的缓冲区句柄。 |
| 参数 |
|
| 功能 | GDAnnounceCUDAArray |
|---|---|
| 描述 | 此函数将目标对象声明为复制操作的目标,并返回引用该单个缓冲区的缓冲区句柄。 |
| 参数 |
|
数据类型#
| STRUCT 的名称 | EVENT_NEW_BUFFER_DATA |
|---|---|
| 描述 | 该事件已将源缓冲区的内容复制到目标缓冲区中。 |
| 参数 |
|
枚举#
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 或更高版本。
- 您的电脑上已安装 CMake。
- 您的电脑上已安装相应的库。
使用示例#
若要使用 Basler 提供的示例:
-
将您从 Basler 收到的示例文件夹复制到主机电脑的硬盘上。
CUDA 示例
对于 CUDA 示例,除电脑上已安装的库外,您只需要 cuda.lib 和 cudart.lib。
OpenGL 示例:CMake 必须能够找到 glew
确保 CMake 能够找到 glew,否则项目将无法正确构建。
CMake 通常应能自动找到 glew。但是,如果未能找到 glew:
-
设置相应的环境变量:
GLUT_ROOT_PATH例如设为 D:\libs\freeglut-2.8.1\win32GLEW_ROOT_PATH例如设为 D:\libs\glew-1.13.0\glew-1.13.0\Win32 -
如果 CMake 仍然无法找到 glew,请手动设置 CMake 项目变量:
GLEW_INCLUDE_DIR例如设为 D:/libs/glew-1.13.0/glew-1.13.0/x64/includeGLEW_LIBRARY例如设为 D:/libs/glew-1.13.0/glew-1.13.0/x64/lib/glew32.libOPENGL_gl_LIBRARY例如设为 opengl32OPENGL_glu_LIBRARY例如设为 glu32
-
-
使用 CMake 创建一个项目,并将 examples\gpudirect\cuda 或 examples\gpudirect\opengl 作为源目录。
- 运行示例。
在执行示例时,系统会要求您选择一个 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)。
: