Linux(Ubuntu)上搭建具有后端并行加速优势的 VTK 开发环境

如何搭建出具有强大的后端并行加速优势的 VTK 开发环境

作为一名对高性能计算和可视化充满热情的开发者,最近在探索如何利用并行计算加速我的 VTK 项目。VTK(Visualization Toolkit)是一个强大的三维可视化工具包,但它默认的并行计算后端(如 vtkSMPTools)在某些情况下可能仅提供串行执行,当然这个默认值可以通过 cmake 配置来修改。在记录搭建步骤前,有必要先梳理一下 vtk 并行加速的方法。

序言

VTK 在 Ubuntu 上的后端并行加速支持主要包括以下几条技术线:

  1. 分布式内存并行:官方内置 MPI 支持,可在编译时打开 VTK_USE_MPI 选项,配合 vtkMultiProcessController 实现多机并行渲染与数据划分。
  2. 共享内存并行:CMake 中把 VTK_SMP_IMPLEMENTATION_TYPE 设为 TBB(或 STDThread、OpenMP),即可在多核 CPU 上加速滤波器、抽取等算法。
    • Sequential(默认):纯串行,调试或无可用的并行库时使用。
    • STDThread:基于 C++11 std::thread,跨平台且无额外依赖。
    • OpenMP:编译器需支持 OpenMP,适合 CPU 多核循环并行。
    • TBB:依赖 Intel oneAPI TBB,负载均衡最好,性能通常最优。
  3. GPU 硬件加速:VTK 的 OpenGL 后端可启用 GPU 深度测试、实例化渲染与着色器,并支持 NVIDIA CUDA 加速体绘制、图像处理等模块。
  4. 多线程渲染: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

  1. 下载源码:

    git clone https://github.com/open-mpi/hwloc.git
    cd hwloc
    git tag
    git checkout hwloc-2.10.0
    
  2. 编译与安装:
    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

  1. 下载源码:

    git clone https://github.com/oneapi-src/oneTBB.git
    cd oneTBB
    git checkout v2021.13
    
  2. 配置:
    image
    勾选Advanced,配置hwloc动态库路径
    8ffcdb44-0cf0-45f0-a561-25f1f00337ed

  3. 编译与安装:

    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

  1. 下载源码:

    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
    
  2. 配置:
    58afb545-9bdd-4605-a14c-9efa7a50e77d

  3. 编译与安装:

    make -j$(nproc)
    sudo make install
    

三、功能测试

3.1 测试 hwloc

  1. 运行测试命令:

    lstopo-no-graphics
    

5c4879bb-4cc5-466a-a798-1497c96539ce

  • 如果输出了系统的拓扑信息,则说明 hwloc 安装成功。

3.2 测试 oneTBB

  1. 编写测试代码:

    创建一个简单的 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;
    }
    
  2. 编译测试代码:

    g++ -o test_tbb test_tbb.cpp -ltbb
    
  3. 运行测试程序:

    ./test_tbb
    

d830e5cc-5926-4efb-865f-a1038f21f640

  • 如果输出了多线程的问候信息,则说明 oneTBB 安装成功。

3.3 测试 VTK

  1. 编写测试代码:

    创建一个简单的 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);
     // ......
    }
    
  2. 编译测试代码:

    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
    
  3. 运行测试程序:

    ./test_vtk
    

3891793d-bb9b-4bfa-b7d3-a654045e1921
image

  • 这里我构建了一个长方体,并将后端加速设为了TBB,在代码中通过vtkSMPTools来将处理操作并行。

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

参考资料

posted @ 2025-11-22 15:40  起飞的乌龟  阅读(160)  评论(0)    收藏  举报