适用于视频的 NVIDIA GPUDirect#
该技术允许以低延迟将视频帧高效传输到 NVIDIA GPU Memory 中。它使您能够完全控制以子帧传输时间将视频流式传输到 GPU 中。
GPUDirect for Video 技术可通过运行在以下操作系统的主机 PC 上的 Basler Framegrabber API 使用:Windows
- OpenGL (Open Graphics Library),或
- CUDA (Compute Unified Device Architecture),这是由 NVIDIA 开发的并行编程框架。
NVIDIA GPUDirect for Video 专为使用 NVIDIA 图形处理单元 (GPU) 的系统而定制。该技术允许以低延迟将视频帧高效传输到 NVIDIA GPU Memory 中。它使您能够完全控制以子帧传输时间将视频流式传输到 GPU 中。
有关详细信息,请参阅制造商网站上的 NVIDIA GPUDirect for Video 技术和 GPUDirect 技术概述部分。
要求#
若要结合使用 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 或更高版本
信息
您可能需要额外的 DLL 和头文件才能运行 GPUDirect for Video。有关更多信息,请联系 Basler 技术支持。
GPUDirect for Video 技术的支持已在 Windows 10 下进行了测试,并且可以保证在此 Windows 版本上运行。
安装#
前提条件#
- GPU 硬件:主机 PC 上已插入支持 GPUDirect for Video 技术的 NVIDIA GPU。
- Parallel Computing Platform/API:主机 PC 上已安装以下软件包之一:
- CUDA (Compute Unified Device Architecture),NVIDIA 的并行编程框架
- OpenGL (Open Graphics Library)
- 采集卡硬件:您选择的 Basler 采集卡已连接到您的主计算机。有关如何连接采集卡的的信息,请参阅连接采集卡。
- 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 支持:
- 将库文件 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。
将文件复制到安装目录中提到的子文件夹后,您就可以通过 Basler Framegrabber API 使用 GPUDirect for Video 的功能。
函数参考#
您可以通过 Basler 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 中。
可用函数#
通过 Basler Framegrabber API 控制 GPUDirect for Video 技术的函数在 CUDA 和 OpenGL 中是相同的。Basler Framegrabber API 提供以下函数:
| 功能 | GDInitLib |
|---|---|
| 描述 | 全局初始化。在任何其他初始化函数之前调用此函数。 |
| 参数 |
|
| 功能 | GDCloseLib |
|---|---|
| 描述 | 当不再需要该库的任何功能时,您必须调用此函数来清除来自 GDInitLib 函数调用。每次调用 GCCloseLib 必须伴随先前的调用 GDInitLib. |
| 参数 | 无 |
| 功能 | GDGetContextInfo |
|---|---|
| 描述 | 使用此函数获取有关当前 Context 的信息。 |
| 参数 |
|
| 功能 | GDRevokeBuffer |
|---|---|
| 描述 | 从采集引擎中移除已注册的 buffer。此函数将释放与该 buffer 相关的所有内部已分配资源。只有当 buffer 未在任何队列中排队时,才能对其进行撤销。 |
| 参数 | [in] BUFFER_HANDLE:指向该 buffer 的 Handle。buffer 本身已通过函数 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL或 GDAnnounceBufferGL. |
| 功能 | GDStartAcquisition |
|---|---|
| 描述 | 启动采集引擎。 |
| 参数 | 无 |
| 功能 | GDStartAcquisitionEx |
|---|---|
| 描述 | 启动采集引擎。 |
| 参数 |
|
| 功能 | GDStopAcquisition |
|---|---|
| 描述 | 停止采集引擎。 |
| 参数 | 无 |
| 功能 | GDAllocateSourceBuffer |
|---|---|
| 描述 | 此函数为单个源 buffer 分配 Memory,将此 buffer 注册到采集引擎,并返回引用该单个 buffer 的 buffer Handle。 |
| 参数 |
|
| 功能 | GDRegisterEvent |
|---|---|
| 描述 | 将 Event 对象注册到特定的 iEventID. |
| 参数 |
|
| 功能 | GDEventGetData |
|---|---|
| 描述 | 从与事件句柄关联的事件数据队列中检索下一个事件数据条目。 |
| 参数 |
|
| 功能 | GDMemcpy |
|---|---|
| 描述 | 将帧grabber传输的下一帧复制到 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 | :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 | 关于新 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。
- 您的电脑上已安装相应的库。
使用示例#
要使用 Basler 提供的示例:
-
将您从 Basler 收到的 examples 文件夹复制到宿主 PC 的硬盘上。
CUDA 示例
对于 CUDA 示例,除了 PC 上已安装的库外,您只需要 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 采集卡:在示例中使用 Grayscale Applet
Basler NVIDIA GPUDirect for Video 支持功能既适用于彩色格式,也适用于灰度格式。
但是,由于这两个示例均设计用于灰度 Applet,因此请确保选择灰度 Applet 来运行示例,例如 Acq_SingleCXP6X4AreaGray.dll(仅适用于 marathon frame grabber)。
: