Linux(Ubuntu)上搭建具有后端并行加速优势的 VTK 开发环境
如何搭建出具有强大的后端并行加速优势的 VTK 开发环境
作为一名对高性能计算和可视化充满热情的开发者,最近在探索如何利用并行计算加速我的 VTK 项目。VTK(Visualization Toolkit)是一个强大的三维可视化工具包,但它默认的并行计算后端(如 vtkSMPTools)在某些情况下可能仅提供串行执行,当然这个默认值可以通过 cmake 配置来修改。在记录搭建步骤前,有必要先梳理一下 vtk 并行加速的方法。
序言
VTK 在 Ubuntu 上的后端并行加速支持主要包括以下几条技术线:
- 分布式内存并行:官方内置 MPI 支持,可在编译时打开
VTK_USE_MPI选项,配合vtkMultiProcessController实现多机并行渲染与数据划分。 - 共享内存并行:CMake 中把
VTK_SMP_IMPLEMENTATION_TYPE设为 TBB(或 STDThread、OpenMP),即可在多核 CPU 上加速滤波器、抽取等算法。- Sequential(默认):纯串行,调试或无可用的并行库时使用。
- STDThread:基于 C++11
std::thread,跨平台且无额外依赖。 - OpenMP:编译器需支持 OpenMP,适合 CPU 多核循环并行。
- TBB:依赖 Intel oneAPI TBB,负载均衡最好,性能通常最优。
- GPU 硬件加速:VTK 的 OpenGL 后端可启用 GPU 深度测试、实例化渲染与着色器,并支持 NVIDIA CUDA 加速体绘制、图像处理等模块。
- 多线程渲染:9.x 版本以后引入
vtkThreadedCompositePolyDataMapper,可把几何管线自动拆分到多线程,显著提升大规模网格渲染帧率。
因此,在无硬件加持的情况下我们可以采取 1、2、4 三条技术路线,且需要我们在工程代码中去实现。技术 2 我们可以选择性能最优的 TBB 加速,不过技术 2 在 TBB 基础版本的上还可以再次赋能。借助 hwloc 提供 CPU 核心、NUMA 节点、缓存层级的拓扑信息的能力,TBB 可以选择最优并行模式(任务窃取、分层调度),这样可以减少跨节点访问延迟并提升数据局部性。
好,回归正题,现在要做的事情就是选择 vtk + tbb + hwloc 源码版本、编译动态库、测试。
一、版本选择
1.1 VTK 9.2.6
- 原因:
- 这是一个广泛使用的版本,具有强大的三维可视化功能。
- 它提供了丰富的文档和社区支持,便于开发和调试。
- 它与 oneTBB 具有良好的兼容性,能够满足我的并行计算需求。
1.2 oneTBB 2021.13
- 原因:
- 这个版本在性能和功能上都有显著提升,同时保持了良好的向后兼容性。
- 它与多种编译器和操作系统兼容,能够在 Ubuntu 24.04.3 LTS 上稳定运行。
- 它提供了丰富的并行算法和数据结构,能够满足 VTK 的并行计算需求。
1.3 hwloc 2.10.0
- 原因:
- 这是一个稳定且功能完善的版本,广泛用于资源拓扑信息的获取。
- 它提供了丰富的 API,能够满足大多数高性能计算场景下的需求。
- 它与 VTK 和 oneTBB 具有良好的兼容性,能够帮助我优化资源分配。
二、编译参数设置
2.1 hwloc 2.10.0
-
下载源码:
git clone https://github.com/open-mpi/hwloc.git cd hwloc git tag git checkout hwloc-2.10.0 -
编译与安装:
hwloc-2.10.0不支持cmake编译,我们可以执行以下脚本完成编译。cd hwloc ./autogen.sh # ./configure --prefix=/usr/local/hwloc-install --enable-static # 需要选择为动态库 ./configure --prefix=/usr/local/hwloc-install --enable-shared make -j$(nproc) sudo make install
2.2 oneTBB 2021.13
-
下载源码:
git clone https://github.com/oneapi-src/oneTBB.git cd oneTBB git checkout v2021.13 -
配置:

勾选Advanced,配置hwloc动态库路径

-
编译与安装:
make -j$(nproc) sudo make install到安装目录下:
~/toolchainbak/oneTbb/oneTBB-2021.13-install/lib$ ldd libtbbbind_2_5_debug.so | grep hwloc libhwloc.so.15 => /lib/x86_64-linux-gnu/libhwloc.so.15 (0x000079c5d47c2000)
2.3 VTK 9.2.6
-
下载源码:
wget https://www.vtk.org/files/release/9.2/VTK-9.2.6.tar.gz tar -xzf VTK-9.2.6.tar.gz cd VTK-9.2.6 -
配置:

-
编译与安装:
make -j$(nproc) sudo make install
三、功能测试
3.1 测试 hwloc
-
运行测试命令:
lstopo-no-graphics

- 如果输出了系统的拓扑信息,则说明
hwloc安装成功。
3.2 测试 oneTBB
-
编写测试代码:
创建一个简单的 C++ 文件
test_tbb.cpp:#include <tbb/tbb.h> #include <iostream> int main() { tbb::parallel_for(0, 10, [](int i) { std::cout << "Hello from thread " << i << std::endl; }); return 0; } -
编译测试代码:
g++ -o test_tbb test_tbb.cpp -ltbb -
运行测试程序:
./test_tbb

- 如果输出了多线程的问候信息,则说明
oneTBB安装成功。
3.3 测试 VTK
-
编写测试代码:
创建一个简单的 C++ 文件
test_vtk.cpp:int main(int argc, char* argv[]) { vtkSMPTools::SetBackend("TBB"); // vtkSMPTools::SetBackend("STDThread"); // vtkSMPTools::SetBackend("OpenMP"); // vtkSMPTools::SetBackend("Sequential"); vtkSMPTools::SetNestedParallelism(true); // 设置线程数 int num_cores = std::thread::hardware_concurrency(); int desired_threads = num_cores; // 或者使用 num_cores vtkSMPTools::Initialize(desired_threads); // 打印配置信息 std::cout << "系统核心数: " << num_cores << std::endl; std::cout << "设置线程数: " << desired_threads << std::endl; std::cout << "VTK实际线程数: " << vtkSMPTools::GetEstimatedNumberOfThreads() << std::endl; std::cout << "VTK后端: " << vtkSMPTools::GetBackend() << std::endl; QApplication app(argc, argv); // ...... } -
编译测试代码:
g++ -o test_vtk test_vtk.cpp \ -lvtkCommonCore-9.2 \ -lvtkCommonDataModel-9.2 \ -lvtkFiltersSources-9.2 \ -lvtkInteractionStyle-9.2 \ -lvtkRenderingCore-9.2 \ -lvtkRenderingOpenGL2-9.2 \ -lvtkFiltersGeometry-9.2 -
运行测试程序:
./test_vtk


- 这里我构建了一个长方体,并将后端加速设为了TBB,在代码中通过vtkSMPTools来将处理操作并行。
通过以上步骤,我在 Ubuntu 24.04.3 LTS 系统上成功搭建了一个高性能计算环境,包括 VTK、oneTBB 和 hwloc。这个环境不仅能够满足我的可视化需求,还能够充分利用多核处理器的计算能力,显著提升性能。希望这份记录能够帮助其他开发者在类似的项目中取得成功。如果你在编译过程中遇到任何问题,或者有任何建议,欢迎随时交流。

浙公网安备 33010602011771号