【VTK三维重建-体绘制】第四期 VTK中GPU加速

很高兴在雪易的CSDN遇见你

VTK技术爱好者 QQ:870202403


前言

上期内容讲到VTK的体绘制技术vtkGPUVolumeRayCastMapper,本文分享VTK中GPU加速的相关内容,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO


目录

前言

[1. vtkGPUInfoList](#1. vtkGPUInfoList)

[1.1 Probe](#1.1 Probe)

[1.2 IsProbed](#1.2 IsProbed)

[1.3 GetNumberOfGPUs](#1.3 GetNumberOfGPUs)

[1.4 GetGPUInfo](#1.4 GetGPUInfo)

[2. vtkGPUInfo](#2. vtkGPUInfo)

[2.1 设置/获取专用显存(DedicatedVideoMemory)](#2.1 设置/获取专用显存(DedicatedVideoMemory))

[2.2 设置/获取专用系统内存(DedicatedSystemMemory)](#2.2 设置/获取专用系统内存(DedicatedSystemMemory))

[2.3 设置/获取共享系统内存(SharedSystemMemory)](#2.3 设置/获取共享系统内存(SharedSystemMemory))

[3. 实际应用](#3. 实际应用)

[4. vtkDummyGPUInfoList](#4. vtkDummyGPUInfoList)

[5. vtkGPUInfoList其他子类](#5. vtkGPUInfoList其他子类)

结论:


1. vtkGPUInfoList

用于存储主机各GPU显存信息列表。

vtkGPUInfoList存储了一系列的vtkGPUInfo。一个主机可以有多个gpu。它通过使用系统调用探测主机来创建和设置列表。这是一个抽象类。具体类是特定于操作系统的。

其重要参数如下:

1.1 Probe

查询该主机中的vtkGPUInfo信息。

1.2 IsProbed

返回是否查询该主机的vtkGPUInfo信息。

1.3 GetNumberOfGPUs

获取GPU的数量

1.4 GetGPUInfo

获取GPU的信息

cpp 复制代码
  /**
   * Return information about GPU i.
   * \pre probed: IsProbed()
   * \pre valid_index: i>=0 && i<GetNumberOfGPUs()
   * \post result_exists: result!=0
   */
  virtual vtkGPUInfo* GetGPUInfo(int i);

2. vtkGPUInfo

用于存储GPU显存信息,其重要参数如下

2.1 设置/获取专用显存(DedicatedVideoMemory)

以字节为单位设置/获取专用显存。初始值为0。通常是最快的。如果它不为0,应该首先考虑它,并且应该忽略DedicatedSystemMemory或SharedSystemMemory。

cpp 复制代码
  //@{
  /**
   * Set/Get dedicated video memory in bytes. Initial value is 0.
   * Usually the fastest one. If it is not 0, it should be taken into
   * account first and DedicatedSystemMemory or SharedSystemMemory should be
   * ignored.
   * 以字节为单位设置/获取专用显存。初始值为0。通常是最快的。
   * 如果它不为0,应该首先考虑它,并且应该忽略DedicatedSystemMemory或SharedSystemMemory。
   */
  vtkSetMacro(DedicatedVideoMemory, vtkTypeUInt64);
  vtkGetMacro(DedicatedVideoMemory, vtkTypeUInt64);
  //@}

2.2 设置/获取专用系统内存(DedicatedSystemMemory)

cpp 复制代码
  //@{
  /**
   * Set/Get dedicated system memory in bytes. Initial value is 0.
   * This is slow memory. If it is not 0, this value should be taken into
   * account only if there is no DedicatedVideoMemory and SharedSystemMemory
   * should be ignored.
   * 以字节为单位设置专用系统内存,初始值为0.
   * 这是慢速内存。如果该值不为0,则只有在没有dedicatedvideommemory且
   * SharedSystemMemory被忽略的情况下才会考虑该值。
   */
  vtkSetMacro(DedicatedSystemMemory, vtkTypeUInt64);
  vtkGetMacro(DedicatedSystemMemory, vtkTypeUInt64);
  //@}

2.3 设置/获取共享系统内存(SharedSystemMemory)

cpp 复制代码
  //@{
  /**
   * Set/Get shared system memory in bytes. Initial value is 0.
   * Slowest memory. This value should be taken into account only if there is
   * neither DedicatedVideoMemory nor DedicatedSystemMemory.
   * 以字节为单位设置/获取共享系统内存,初始值为0. 此为最慢的内存。
   * 只有在既没有dedicatedvideommemory也没有DedicatedSystemMemory的情况下,才应该考虑这个值。
   */
  vtkSetMacro(SharedSystemMemory, vtkTypeUInt64);
  vtkGetMacro(SharedSystemMemory, vtkTypeUInt64);
  //@}

3. 实际应用

cpp 复制代码
//摘自vtkGPUVolumeRayCastMapper  
this->MaxMemoryInBytes = 0;
  vtkGPUInfoList* l = vtkGPUInfoList::New();
  l->Probe();
  if (l->GetNumberOfGPUs() > 0)
  {
    vtkGPUInfo* info = l->GetGPUInfo(0);
    this->MaxMemoryInBytes = info->GetDedicatedVideoMemory();
    if (this->MaxMemoryInBytes == 0)
    {
      this->MaxMemoryInBytes = info->GetDedicatedSystemMemory();
    }
    // we ignore info->GetSharedSystemMemory(); as this is very slow.
  }
  l->Delete();

  if (this->MaxMemoryInBytes == 0) // use some default value: 128MB.
  {
    this->MaxMemoryInBytes = 128 * 1024 * 1024;
  }

4. vtkDummyGPUInfoList

vtkDummyGPUInfoList通过将gpu的计数设置为零来实现Probe()。在没有特定于操作系统的实现时非常有用。主要用于重写Probe函数。将GPU的数量置零。

cpp 复制代码
void vtkDummyGPUInfoList::Probe()
{
  if (!this->Probed)
  {
    this->Probed = true;
    this->Array = new vtkGPUInfoListArray;
    this->Array->v.resize(0); // no GPU.
  }
  assert("post: probed" && this->IsProbed());
}

5. vtkGPUInfoList其他子类

本文基于VTK9.0.3版本,无vtkCoreGraphicsGPUInfoList,vtkDirectXGPUInfoList和vtkXGPUInfoList接口。

结论:

本文粗略讨论VTK中使用GPU的方法,以后再慢慢研究VTK进行GPU加速的详细流程。

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

相关推荐
cwj&xyp22 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
晓纪同学3 小时前
QT-简单视觉框架代码
开发语言·qt
威桑3 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服3 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
fyzy3 小时前
Qt获取本地计算的CPU温度
qt
cbdg37573 小时前
Qt 6 QML Settings location 不创建指定路径文件
qt
了一li3 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
杨德杰3 小时前
QT网络(一):主机信息查询
网络·qt
黄金右肾4 小时前
Qt之串口设计-线程实现(十二)
qt·thread·serialport
xiaoshiguang35 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode