最快、内存效率最高的格子玻尔兹曼 CFD 软件,通过 OpenCL 在所有 GPU 上运行。免费用于非商业用途。
(点击图片即可显示 YouTube 上的视频)
v1.0 (04.08.2022) 变更(公开发布)
公开发布
v1.1 (29.09.2022) 更改(GPU 体素化)
在 GPU 上添加了实体体素化(慢速算法)
添加了打印当前相机位置的工具( G键)
小错误修复(针对三角形渲染的 Intel iGPU 驱动程序错误的解决方法)
v1.2 (24.10.2022) 更改(力/扭矩计算)
添加了计算物体上的力/扭矩的函数
添加了翻译Mesh的功能
添加了斯托克斯拖动验证设置
v1.3 (10.11.2022) 更改(小错误修复)
增加扭矩单位转换功能
FORCE_FIELD
和VOLUME_FORCE
现在可以独立使用
小错误修复(使用二进制数字文字解决 AMD 旧版驱动程序错误的方法)
v1.4 (14.12.2022) 更改(Linux 图形)
完全重写 C++ 图形库以最大限度地减少 API 依赖性
在带有 X11 的 Linux 上添加了交互式图形模式
修复了 2D 中的流线可视化错误
v2.0 (09.01.2023) 变更(多 GPU 升级)
在单个节点(PC/笔记本电脑/服务器)上添加(跨供应商)多 GPU 支持
v2.1 (15.01.2023) 更改(快速体素化)
在 GPU 上实现固体体素化速度快如闪电(新算法,从几分钟到几毫秒)
v2.2 (20.01.2023) 更改(速度体素化)
添加了在 GPU 上对移动/旋转几何体进行体素化的选项,并根据旋转中心、线速度和旋转速度对每个网格点进行自动速度初始化
在重新体素化期间从固体转换为液体的细胞现在已正确初始化其 DDF
添加了在read_stl(...)
期间不自动缩放网格的选项,并且size
参数为负
添加了用于使用行进立方体进行实体边界渲染的内核
v2.3 (30.01.2023) 更改(粒子)
使用浸没边界方法添加粒子(被动或2路耦合,仅支持单GPU)
对 GPU 体素化算法进行小幅优化(网格边界框外的工作组线程在找到光线网格交叉点后返回)
显示的 GPU 内存分配大小现在完全准确
修复了src/utilities.hpp
中write_line()
函数中的错误
删除了 Linux/macOS 的.exe
文件扩展名
v2.4 (11.03.2023) 更改(UI 改进)
添加了带有H键的帮助菜单,显示键盘/鼠标控制、可视化设置和模拟统计数据
改进键盘/鼠标控制( +/-用于缩放,鼠标单击释放/锁定光标)
添加了如果分辨率设置大于内存允许的最大可能网格分辨率的建议
多 GPU 通信的小优化(性能差异不显着)
修复了温度扩展的温度平衡函数中的错误
修复了天空盒颜色函数中英特尔 iGPU 的错误双文字
修复了 make.sh 中多 GPU 设备 ID 不会转发到可执行文件的错误
图形引擎中的小错误修复(旋转期间自由光标未居中,VR 模式下的标签)
修复了LBM::voxelize_stl()
大小参数标准初始化中的错误
v2.5 (11.04.2023) 更改(光线追踪大修)
在光线追踪图形的流体中实现光吸收(无性能影响)
当相机位于流体内时提高了光线追踪帧率
修复了天空盒杆闪烁的伪影
修复了在重新体素化过程中移动物体会留下固体网格单元的错误轨迹的错误
v2.6 (16.04.2023) 更改(Intel Arc 补丁)
修复了 Intel Arc GPU 的 OpenCL 问题:现在可以分配 >4GB 的 VRAM,并报告正确的 VRAM 容量
v2.7 (29.05.2023) 变更(可视化升级)
添加了切片可视化(键2 / 键3模式,然后使用键T切换切片模式,使用键Q / E移动切片)
使标志线框/实体表面可视化内核可通过键1切换
添加了表面压力可视化(启用FORCE_FIELD
并调用lbm.calculate_force_on_boundaries();
时键1 )
使用lbm.write_mesh_to_vtk(Mesh* mesh);
添加了网格的二进制.vtk
导出函数;
在 PARTICLES 扩展中为integrate_particles()
函数添加了time_step_multiplicator
使 Intel Arc 上错误内存报告的修正更加稳健
修复了write_file()
模板函数中的错误
恢复为每个 OpenCL 设备的单独cl::Context
,否则共享上下文会在所有其他未使用的 Nvidia GPU 上分配额外的 VRAM
从 Visual Studio 解决方案文件中删除了调试和 x86 配置(减少了编译的复杂性)
修复了粒子可能太靠近墙壁并被卡住或离开流体相的错误(增加了边界力)
v2.8 (24.06.2023) 更改(文档 + 完善)
终于添加了更多文档
清理了setup.cpp
中的所有示例设置,以更加适合初学者,并在defines.hpp
中添加了所需的扩展作为所有设置的注释
通过添加省略自动网格重新定位的选项,改进了复合.stl
几何图形的加载,为utilities.hpp
中的Mesh
结构添加了更多功能
添加了uint3 resolution(float3 box_aspect_ratio, uint memory)
函数,用于根据框长宽比和 VRAM 占用(以 MB 为单位)计算模拟框分辨率
添加了bool lbm.graphics.next_frame(...)
函数以在main_setup
计算循环中导出指定视频长度的图像
添加了VIS_...
宏,以便在lbm.graphics.visualization_modes
中的无头图形模式下轻松设置可视化模式
现在,模拟框尺寸会自动被多 GPU 模拟的域均分
修复了加载文件的信息/警告/错误消息格式,并使信息/警告/错误消息标签着色
添加了艾哈迈德身体设置作为如何计算身体力和阻力系数的示例
添加了 Cessna 172 和 Bell 222 设置以展示加载复合 .stl 几何形状和移动部件的三维像素化
添加了可选的半透明渲染模式( defines.hpp
中的#define GRAPHICS_TRANSPARENCY 0.7f
)
修复了交互式图形中流线可视化的闪烁问题
改进了切片模式下流线的平滑定位
修复了SURFACE
扩展中的mass
和massex
也分配在 CPU RAM 中的错误(不需要)
修复了多 GPU 模式下光环数据的 Q 准则渲染中的错误,减小了域之间的间隙宽度
从网格体素化内核中删除了共享内存优化,因为它在使用新 GPU 驱动程序的 Nvidia GPU 上崩溃,并且与旧的 OpenCL 1.0 GPU 不兼容
修复了当没有表面位于具有周期性边界的模拟盒壁处时的光线追踪衰减颜色
v2.9 (31.07.2023) 更改(多线程)
使用std::threads
在utilities.hpp
中添加了跨平台parallel_for
实现
通过多线程几何初始化和健全性检查,模拟启动速度显着加快 (>4 倍)
具有多线程功能的更快的calculate_force_on_object()
和calculate_torque_on_object()
函数
将总运行时间和 LBM 运行时间添加到lbm.write_status()
修复了体素化射线方向的错误,用于重新体素化旋转物体
修复了Mesh::get_bounding_box_size()
中的错误
修复了utilities.hpp
中print_message()
函数的错误
v2.10 (05.11.2023) 更改(视锥体剔除)
当只有部分模拟框可见时,通过视锥体剔除提高了光栅化性能
改进了居中/自由相机模式之间的切换
重构OpenCL渲染库
当使用units.set_m_kg_s(...)
时,单位换算系数现在会自动打印在控制台中
FluidX3D 基准测试的启动时间更快
voxelize_mesh(...)
内核中的矿工错误修复
修复了shading(...)
用标准 C99 LCG 替换慢速(在多线程中) std::rand()
函数
对 Intel Arc GPU 上错误的 VRAM 容量报告进行更强大的纠正
修复了一些小的编译器警告
v2.11 (07.12.2023) 更改(改进了 Linux 图形)
Linux 上的交互式图形现在也处于全屏模式,与 Windows 完全匹配
使用std::fill
和enqueueFillBuffer
使 CPU/GPU 缓冲区初始化速度显着加快(模拟启动速度总体加快约 8%)
将操作系统信息添加到 OpenCL 设备驱动程序版本打印输出中
修复了在非常小的视场中截锥体剔除时的闪烁问题
修复了当visualization_modes
更改时渲染/导出的帧未更新的错误
v2.12 (18.01.2024) 更改(启动速度更快)
如果安装了make
,在使用多个 CPU 内核的 Linux 上编译源代码的速度可提高约 3 倍
模拟初始化速度显着加快(单 GPU 约 40%,多 GPU 约 15%)
Memory_Container::reset()
函数中的小错误修复
v2.13 (11.02.2024) 更改(改进了 .vtk 导出)
导出的.vtk
文件中的数据现在自动转换为 SI 单位
通过多线程处理.vtk
导出速度提高约 2 倍
为TEMPERATURE
扩展添加了单位转换功能
修复了光线追踪中轴对齐相机的图形伪影
修复了 macOS 的get_exe_path()
修复了 Linux 上的 X11 多显示器问题
Nvidia 驱动程序错误的解决方法:Nvidia GPU 上的大缓冲区的enqueueFillBuffer
被破坏
修复了由-cl-fast-relaxed-math
引起的缓慢数字漂移问题
修复了LBM::write_status()
中错误的最大分配大小报告
修复了LBM::write_mesh_to_vtk()
中缺少将坐标缩放为 SI 单位的问题
v2.14 (03.03.2024) 变更(可视化升级)
现在可以使用Z键在速度/密度/温度之间切换着色
统一改进的调色板,用于速度/密度/温度可视化
现在可以使用H键显示具有自动单位转换功能的色标
用于场可视化的切片模式现在绘制完全填充的切片,而不是仅绘制速度矢量的线
VIS_FLAG_SURFACE
和VIS_PHI_RASTERIZE
模式下的着色现在更加平滑
make.sh
现在会自动检测 Linux 上的操作系统和 X11 支持,并且仅在上次编译成功时才运行 FluidX3D
修复了 Android 上的编译器警告
修复了由于非标准解释器路径而导致make.sh
在某些系统上失败的问题
修复了make
在某些系统上无法使用多核进行编译的问题
v2.15 (09.04.2024) 更改(帧率提升)
消除了渲染链中的一帧内存复制和一帧清除操作,在 Windows 和 Linux 上帧速率提高了 20-70%
启用g++
编译器优化以实现更快的启动和更高的渲染帧速率
修复了多线程健全性检查中的错误
修复了热膨胀系数的错误单位转换
固定密度到压力的转换(LBM 单位)
修复了光线追踪内核可能锁定模拟的错误
通过光线追踪修复了轻微的视觉伪影
修复了在INTERACTIVE_GRAPHICS_ASCII
渲染开始之前控制台有时未被清除的问题
v2.16 (02.05.2024) 更改(错误修复)
通过在边缘上进行 1D 插值而不是 3D 插值,简化了 10% 的行进立方体实现,从而可以摆脱边缘表
添加了更快、简化的行进立方体变体,用于实体表面渲染,其中边缘始终位于网格单元之间的中间
OpenCL 渲染内核中的重构
修复了因阵列越界访问而在 Intel OpenCL CPU 运行时中体素化失败的问题
修复了与单 GPU 相比,体素化在多 GPU 中并不总是产生相同的二进制结果
修复了自由表面模拟速度体素化失败的问题
通过用a*b+c
宏替换融合乘加 ( fma
) 修复了 ARM GPU 上糟糕的性能
修复了 Linux 中QWERTY
键盘布局的Y / Z键不正确的问题
修复了滚动时静止图像中帮助叠加中的自由相机移动速度未更新的问题
修复了在具有 Linux-X11 交互式图形的触控板上滚动时光标有时会闪烁的问题
修复了相机未移动时多 GPU 交互式渲染的闪烁问题
修复了缺失的XInitThreads()
调用,该调用可能会导致某些系统上的 Linux 交互式图形崩溃
修复了graphics_rasterize_phi()
和graphics_flags_mc()
内核之间的z-fighting
v2.17 (05.06.2024) 更改(无限域名解析)
域不再局限于 42.9 亿(2³²、1624³)个网格单元或 225 GB 内存;如果使用更多,OpenCL 代码将自动使用 64 位索引进行编译
用于单 GPU 模拟的新的、更快的基于光线追踪的场可视化
在文档中添加了 GPU 驱动程序和 OpenCL 运行时安装说明
重构INTERACTIVE_GRAPHICS_ASCII
修复了floatN
、 floatNxN
、 doubleN
、 doubleNxN
析构函数中的内存泄漏(均未使用)
使相机移动/旋转/缩放行为独立于帧速率
修复了如果设备报告 0 MHz 时钟速度, smart_device_selection()
将打印错误警告的问题
v2.18 (21.07.2024) 更改(更多错误修复)
添加了对 Linux 上高刷新率显示器的支持
文档中更紧凑的 OpenCL 运行时安装脚本
如果没有可用的 OpenCL 设备,驱动程序/运行时安装说明现在将打印到控制台
将域信息添加到LBM::write_status()
为uint3
输入参数添加了LBM::index
函数
通过将最大渲染距离从 10k 增加到 2.1M,修复了非常大的模拟有时无法正确渲染的问题
修复了 Linux 上高屏幕刷新率下的鼠标输入卡顿问题
修复了 OpenCL 英特尔 CPU 运行时自由表面光线追踪中的图形伪影
修复了在控制台中打印的运行时估计,用于多个lbm.run(...)
调用的设置
样本设置中的固定密度振荡( lbm_u
太大)
修复了raytrace_phi()
中的小图形伪影
修复了ray_grid_traverse_sum()
中的次要图形伪影
修复了雨滴样本设置中错误的打印时间步数
v2.19 (07.09.2024) 更改(相机样条线)
现在,使用 Catmull-Rom 样条线,相机可以沿着提供的关键帧相机位置列表的平滑路径飞行
更准确的剩余运行时间估计,包括渲染所花费的时间
默认启用 FP16S 内存压缩
使用G键打印的相机位置现已格式化,以便于复制/粘贴
使用美人鱼甘特图在自述文件中添加了基准图表
在模拟启动期间将内存分配信息放置在更好的位置
修复了INTERACTIVE_GRAPHICS
和lbm.graphics.write_frame();
修复了 AMD GPU 和 OpenCL 的 Intel CPU 运行时的最大缓冲区分配大小限制
修复了 2D 模拟的错误Re<Re_max
信息打印输出
bandwidth_bytes_per_cell_device()
中的小修复
阅读 FluidX3D 文档!
流媒体(第 2/2 部分)
f 0温度( x , t ) = f 0 ( x , t )
f i temp ( x , t ) = f ( t %2 ? i : ( i %2 ? i +1 : i -1)) ( i %2 ? x : x - e i , t ) for i ∈ [1 , q -1]
碰撞
ρ ( x , t ) = (Σ i f i temp ( x , t )) + 1
u ( x , t ) = 1 ∕ ρ ( x , t ) Σ i c i f i temp ( x , t )
fi eq-shifted ( x , t ) = w i ρ · ( ( u ° c i ) 2 ∕ (2 c 4 ) - ( u ° u ) ∕ (2c 2 ) + ( u ° c i ) ∕ c 2 ) + w i ( ρ -1)
fi temp ( x , t +Δ t ) = fi temp ( x , t ) + Ω i ( fi temp ( x , t ), fi eq-shifted ( x , t ), τ )
流媒体(第 1/2 部分)
f 0 ( x , t + Δ t ) = f 0温度( x , t + Δ t )
f ( t %2 ? ( i %2 ? i +1 : i -1) : i ) ( i %2 ? x + e i : x , t + Δ t ) = f i temp ( x , t + Δ t ) 对于i ∈ [1, q -1]
多变的 | 国际单位制 | 定义方程 | 描述 |
---|---|---|---|
x | 米 | x = (x,y,z) T | 笛卡尔坐标中的 3D 位置 |
t | s | - | 时间 |
ρ | 公斤∕立方米 | ρ = (Σ i f i )+1 | 流体的质量密度 |
p | 千克∕米·秒² | p = c ² ρ | 流体压力 |
你 | 米∕秒 | u = 1 ∕ ρ Σ i c i f i | 流体速度 |
ν | 平方米∕秒 | ν = μ ∕ ρ | 流体运动剪切粘度 |
μ | 公斤∕米·秒 | μ = ρ ν | 流体动力粘度 |
我 | 公斤∕立方米 | - | 移位密度分布函数 (DDF) |
Δx | 米 | Δx = 1 | 晶格常数(LBM 单位) |
Δt | s | Δt = 1 | 模拟时间步长(以LBM为单位) |
c | 米∕秒 | c = 1 ∕ √3 Δ x ∕ Δ t | 声格速度(LBM 单位) |
我 | 1 | 0 ≤ i < q | LBM流方向索引 |
q | 1 | q ∈ { 9,15,19,27 } | LBM流方向的数量 |
我 | 米 | D2Q9 / D3Q15/19/27 | LBM 流方向 |
我 | 米∕秒 | c i = e i ∕ Δ t | LBM 流速度 |
我 | 1 | Σ i w i = 1 | LBM 速度设置权重 |
Ω一 | 公斤∕立方米 | SRT 或 TRT | LBM碰撞算子 |
τ | s | τ = ν ∕ c ² + Δ t ∕ 2 | LBM弛豫时间 |
速度设置:D2Q9、D3Q15、D3Q19(默认)、D3Q27
碰撞算子:单弛豫时间 (SRT/BGK)(默认)、双弛豫时间 (TRT)
DDF 移位和其他代数优化以最小化舍入误差
??????????????????????????????????????????????????? ????
(密度 ?、速度 ?、标志 ?、DDF ?;每个方格 = 1 字节)
每 1 GB VRAM 允许容纳 1900 万个单元
使用 Esoteric-Pull 进行就地流式传输:消除内存中密度分布函数 (DDF) 的冗余副本;由于隐含的反弹边界,内存需求几乎减少了一半,并略微提高了性能;为单单元就地流提供最佳内存访问模式
解耦算术精度 (FP32) 和内存精度(FP32 或 FP16S 或 FP16C):所有算术均在 FP32 中完成,以便在所有硬件上兼容,但内存中的 DDF 可以压缩为 FP16S 或 FP16C:几乎将内存需求再次减少一半性能加倍,且不影响大多数设置的整体精度
TYPE_S
(静止或移动)实体边界
TYPE_E
平衡边界(流入/流出)
TYPE_T
温度边界
TYPE_F
自由表面(流体)
TYPE_I
自由表面(界面)
TYPE_G
自由表面(气体)
TYPE_X
剩余用于自定义使用或进一步扩展
TYPE_Y
剩余用于自定义使用或进一步扩展
(密度 ?、速度 ?、标志 ?、2 个 DDF 副本 ?/?;每个方块 = 1 字节)
每 1 GB VRAM 允许容纳 300 万个单元
具有 FP64 的传统 LBM (D3Q19) 需要 ~344 字节/单元
FluidX3D (D3Q19) 使用 Esoteric-Pull+FP16 仅需要 55 字节/单元
节省大量成本:D3Q19 LBM 最大单 GPU 网格分辨率比较
GPU显存容量 | 1GB | 2GB | 3GB | 4GB | 6GB | 8GB | 10GB | 11GB | 12GB | 16 GB | 20GB | 24GB | 32GB | 40GB | 48GB | 64GB | 80GB | 94GB | 128GB | 192GB | 256GB |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
GPU 大概价格 | 25 美元 GT 210 | 25 美元 显卡950 | 12 美元 显卡1060 | 50 美元 GT 730 | 35 美元 显卡1060 | 70 美元 RX 470 | 500 美元 RTX 3080 | 240 美元 GTX 1080 钛 | 75 美元 特斯拉 M40 | 75 美元 本能军情25 | 900 美元 RX 7900XT | 205 美元 特斯拉 P40 | 600 美元 本能 MI60 | $5500 A100 | $2400 RTX 8000 | 1万美元 本能 MI210 | 11,000 美元 A100 | > 4 万美元 H100 NVL | ? GPU 最大 1550 | 〜10,000 美元 米300X | - |
传统 LBM (FP64) | 144立方 | 182立方 | 208立方 | 230立方 | 262立方 | 288立方 | 312立方 | 322立方 | 330立方 | 364立方 | 392立方 | 418立方 | 460立方 | 494立方 | 526立方 | 578立方 | 624立方 | 658立方 | 730立方 | 836立方 | 920立方 |
FluidX3D (FP32/FP32) | 224立方 | 282立方 | 322立方 | 354立方 | 406立方 | 448立方 | 482立方 | 498立方 | 512立方 | 564立方 | 608立方 | 646立方 | 710立方 | 766立方 | 814立方 | 896立方 | 966立方 | 1018立方 | 1130立方 | 1292立方 | 1422立方 |
FluidX3D (FP32/FP16) | 266立方 | 336立方 | 384立方 | 424立方 | 484立方 | 534立方 | 574立方 | 594立方 | 610立方 | 672立方 | 724立方 | 770立方 | 848立方 | 912立方 | 970立方 | 1068立方 | 1150立方 | 1214立方 | 1346立方 | 1540立方 | 1624立方 |
域分解允许汇集多个 GPU 的 VRAM,以获得更大的网格分辨率
GPU 不必相同(甚至不必来自同一供应商),但建议使用类似的 VRAM 容量/带宽
域通信架构(简化)
++ .------------------------------------------------------------ ------------------。 ++++ | GPU 0 | ++++ | LBM 域 0 | ++++'-------------------------------------------------------- --------------------' ++++ | 选择性/| ++++ |/ VRAM 内复制 | ++++ .--------------------------------------------------------- ----------。 ++++ | GPU 0 - 传输缓冲区 0 | ++++'-------------------------------------------------------- ----------'++!! | PCIe /| !!! |/ 复制 | !!@@ .-------------------------。 .-------------------------。 @@@@ | CPU - 传输缓冲区 0 | | CPU - 传输缓冲区 1 | @@@@ '-------------------------' /'----------------- --------' @@@@ 指针 X 交换 @@@@ .----------------------------./ .- ------------------------。 @@@@ | CPU - 传输缓冲区 1 | | CPU - 传输缓冲区 0 | @@@@ '-------------------------' '------------------ -------'@@!! /| PCIe | !!! | 复制 |/!!++ .------------------------------------------ -------------。 ++++ | GPU 1 - 传输缓冲区 1 | ++++'-------------------------------------------------------- ----------' ++++ /| 选择性| ++++ | VRAM 内复制 |/ ++++ .---------------------------------------------------- --------------------------。 ++++ | GPU 1 | ++++ | LBM 域 1 | ++++'-------------------------------------------------------- --------------------' ++## | #### 域同步屏障 #### | ##|| -------------------------------------------------- -----------> 时间||
域通信架构(详细)
++ .------------------------------------------------------------ ------------------。 ++++ | GPU 0 | ++++ | LBM 域 0 | ++++'-------------------------------------------------------- --------------------' ++++ | 选择性输入- /| | 选择性输入- /| | 选择性输入- /| ++++ |/ VRAM 复制 (X) | |/ VRAM 复制 (Y) | |/ VRAM 复制 (Z) | ++++ .---------------------.---------------------.- --------------------。 ++++ | GPU 0 - TB 0X+ | GPU 0 - TB 0Y+ | GPU 0 - TB 0Z+ | ++++ | GPU 0 - TB 0X- | GPU 0 - TB 0Y- | GPU 0 - TB 0Z- | ++++ '---------------------'---------------------'- --------------------'++!! | PCIe /| | PCIe /| | PCIe /| !!! |/ 复制 | |/ 复制 | |/ 复制 | !!@@ .---------。 .---------.---------。 .---------.---------。 .---------。 @@@@ | CPU 0X+ | | CPU 1X-| CPU 0Y+ | | CPU 3Y- | CPU 0Z+ | | CPU 5Z- | @@@@ | CPU 0X-| | CPU 2X+ | CPU 0Y-| | CPU 4Y+ | CPU 0Z-| | CPU 6Z+ | @@@@ '--------- /---------'--------- /---------'----- ---- /---------' @@@@ 指针 X 交换 (X) 指针 X 交换 (Y) 指针 X 交换 (Z) @@@@ .-------- -/ ---------.---------/ ---------.---------/ -------- -. @@@@ | CPU 1X- | | CPU 0X+ | CPU 3Y- | | CPU 0Y+ | CPU 5Z- | | CPU 0Z+ | @@@@ | CPU 2X+ | | CPU 0X-| CPU 4Y+ | | CPU 0Y-| CPU 6Z+ | | CPU 0Z-| @@@@ '---------' '--------'---------' '---------'--- ------''---------'@@!! /| PCIe | /| PCIe | /| PCIe | !!! |复制 |/ |复制 |/ |复制 |/!!++ .--------------------..-------------------- -..--------------------。 ++++ | GPU 1 - TB 1X- || GPU 3 - TB 3Y- || GPU 5 - TB 5Z- | ++++ :====================::======================:: ====================: ++++ | GPU 2 - TB 2X+ || GPU 4 - TB 4Y+ || GPU 6 - TB 6Z+ | ++++ '--------------------''--------------------'' --------------------' ++++ /|选择性输入- | /|选择性输入- | /|选择性输入- | ++++ | VRAM 复制 (X) |/ | VRAM 复制 (Y) |/ | VRAM 复制 (Z) |/ ++++ .--------------------..---------------- -----..--------------------。 ++++ | 图形处理器 1 || GPU 3 || GPU 5 | ++++ | LBM 域 1 || LBM 域 3 || LBM 域 5 | ++++ :====================::======================:: ====================: ++++ | GPU 2 || GPU 4 || GPU 6 | ++++ | LBM 域 2 || LBM 域 4 || LBM 域 6 | ++++ '--------------------''--------------------'' --------------------' ++## | | | #### | 域同步障碍| #### | | | ##|| -------------------------------------------------- -----------> 时间 ||
单 GPU/CPU 基准测试
多 GPU 基准测试
用于热 DDF 的 D3Q7 子网格
使用 Esoteric-Pull 进行热 DDF 的就地流式传输
可选 FP16S 或 FP16C 压缩,适用于带 DDF 移位的热 DDF
流体体积模型
用于高效曲率计算的完全分析 PLIC
改善质量守恒
除了stream_collide()
内核之外,仅用4个内核即可实现超高效的实现
可选择计算固体边界上流体的力
固定中网格反弹边界(固定实体边界)
移动中间网格反弹边界(移动实体边界)
平衡边界(非反射流入/流出)
温度边界(固定温度)
边界类型
每体积的全局力(郭力),可以即时修改
每体积的局部力(力场)
最先进的自由表面 LBM (FSLBM) 实施:
热 LBM 模拟热对流
Smagorinsky-Lilly 子网格湍流 LES 模型可保持大雷诺数模拟的稳定
Π αβ = Σ i e iα e iβ ( f i - f i eq-shifted )
Q = Σ αβ Π αβ 2
______________________
τ = ½ (τ 0 + √ τ 0 2 + (16√2) ∕ ( 3π 2 ) √Q ∕ ρ )
采用浸没边界法的粒子(被动或双向耦合,仅限单 GPU)
FluidX3D 可以进行如此大的模拟,以至于存储用于以后渲染的体积数据变得难以管理(例如单帧 120GB,视频数百 TeraByte)
相反,FluidX3D 允许直接在 VRAM 中渲染原始模拟数据,因此无需将大体积文件导出到硬盘(请参阅我的技术演讲)
渲染速度非常快,可以实时交互地进行光栅化和光线跟踪
光栅化和光线追踪在 OpenCL 中完成,适用于所有 GPU,甚至是那些没有 RTX/DXR 光线追踪核心或根本没有任何渲染硬件的 GPU(例如 A100、MI200...)
如果没有可用的监视器(例如在远程 Linux 服务器上),则可以使用 ASCII 渲染模式以交互方式可视化终端中的模拟(甚至在 WSL 和/或通过 SSH 中)
通过无缝域分解光栅化实现完全多 GPU 并行渲染
禁用交互式图形模式时,图像分辨率可以达到 VRAM 允许的大小(4K/8K/16K 及以上)
(交互式)可视化模式:
标记线框/实体表面(以及实体单元上的力矢量或表面压力(如果使用扩展)
速度场(切片模式)
流线型(使用切片模式)
速度色 Q 准则等值面
带有行进立方体的光栅化自由表面
光线追踪自由表面,具有快速光线网格遍历和行进立方体,1-4 条光线/像素或 1-10 条光线/像素
FluidX3D 是用 OpenCL 1.2 编写的,因此它可以在所有供应商的所有硬件上运行(Nvidia、AMD、Intel...):
世界上最快的数据中心 GPU:MI300X、H100 (NVL)、A100、MI200、MI100、V100(S)、GPU Max 1100...
游戏 GPU(台式机/笔记本电脑):Nvidia GeForce、AMD Radeon、Intel Arc
专业/工作站 GPU:Nvidia Quadro、AMD Radeon Pro / FirePro、Intel Arc Pro
集成 GPU
CPU(需要安装适用于 OpenCL 的 Intel CPU Runtime)
Intel Xeon Phi(需要安装适用于 OpenCL 的 Intel CPU Runtime)
智能手机 ARM GPU
原生跨供应商多 GPU 实现
使用 PCIe 通信,因此不需要 SLI/Crossfire/NVLink/InfinityFabric
单节点并行化,因此无需安装 MPI
GPU 甚至不必来自同一供应商,但建议使用相似的内存容量和带宽
适用于使用 C++17 的 Windows 和 Linux,对 macOS 和 Android 的支持也有限
支持从二进制.stl
文件导入和体素化三角形网格,具有快速 GPU 体素化
支持将体积数据导出为二进制.vtk
文件
支持将三角形网格导出为二进制.vtk
文件
支持将渲染图像导出为.png
/ .qoi
/ .bmp
文件;编码在 CPU 上并行运行,而 GPU 上的模拟可以无延迟地继续进行
以下是各种硬件的性能基准(以 MLUP/s 为单位),即每秒更新多少百万个晶格单元。用于基准测试的设置是 D3Q19 SRT,未启用扩展(仅具有隐式中网格反弹边界的 LBM),并且设置由一个具有足够大小(通常为 256³)的空立方体组成。如果没有扩展,单个晶格单元需要:
内存容量为 93 (FP32/FP32) 或 55 (FP32/FP16) 字节
每个时间步 153 (FP32/FP32) 或 77 (FP32/FP16) 字节的内存带宽
每个时间步 363 (FP32/FP32) 或 406 (FP32/FP16S) 或 1275 (FP32/FP16C) FLOP(FP32+INT32 操作合计)
因此,该实现的算术强度为 2.37 (FP32/FP32) 或 5.27 (FP32/FP16S) 或 16.56 (FP32/FP16C) FLOPs/字节。因此性能仅受内存带宽的限制。左侧 3 列中的表格显示了数据表中的硬件规格(理论峰值 FP32 计算性能、内存容量、理论峰值内存带宽)。右侧 3 列显示了 FP32/FP32、FP32/FP16S、FP32/FP16C 浮点精度设置下测得的 FluidX3D 性能,圆括号中的(屋顶线模型效率)表示正在使用理论峰值内存带宽的百分比。
如果您的 GPU/CPU 尚未出现在列表中,您可以在此处报告您的基准测试。