【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

相关推荐
Dizzy.51720 分钟前
数据结构(查找)
数据结构·学习·算法
软件开发技术局42 分钟前
撕碎QT面具(8):对控件采用自动增加函数(转到槽)的方式,发现函数不能被调用的解决方案
开发语言·qt
OopspoO2 小时前
QT事件循环
qt·事件循环
MessiGo3 小时前
OpenGL(2)基于Qt做OpenGL开发
qt
分别努力读书3 小时前
acm培训 part 7
算法·图论
武乐乐~3 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
'Debug3 小时前
算法从0到100之【专题一】- 双指针第一练(数组划分、数组分块)
算法
Fansv5874 小时前
深度学习-2.机械学习基础
人工智能·经验分享·python·深度学习·算法·机器学习
yatingliu20195 小时前
代码随想录算法训练营第六天| 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数 、1. 两数之和
c++·算法
uhakadotcom5 小时前
Google DeepMind最近发布了SigLIP 2
人工智能·算法·架构