很高兴在雪易的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