OpenCL을 통해 모든 GPU에서 실행되는 가장 빠르고 메모리 효율적인 격자 Boltzmann CFD 소프트웨어입니다. 비상업적 용도로는 무료입니다.
(이미지를 클릭하시면 유튜브 영상을 보실 수 있습니다)
v1.0(2022년 8월 4일) 변경 사항(공개 릴리스)
공개 릴리스
v1.1(2022.09.29) 변경 사항(GPU 복셀화)
GPU에 솔리드 복셀화 추가(느린 알고리즘)
현재 카메라 위치를 인쇄하는 도구 추가(키 G )
사소한 버그 수정(삼각형 렌더링이 포함된 Intel iGPU 드라이버 버그에 대한 해결 방법)
v1.2(2022.10.24) 변경 사항(힘/토크 계산)
물체에 가해지는 힘/토크를 계산하는 기능 추가
Mesh를 번역하는 기능 추가
Stokes 드래그 검증 설정 추가
v1.3(2022년 10월 11일) 변경 사항(사소한 버그 수정)
토크 단위 변환 기능 추가
이제 FORCE_FIELD
및 VOLUME_FORCE
독립적으로 사용할 수 있습니다.
사소한 버그 수정(이진수 리터럴이 포함된 AMD 레거시 드라이버 버그에 대한 해결 방법)
v1.4(2022년 12월 14일) 변경 사항(Linux 그래픽)
API 종속성을 최소화하기 위해 C++ 그래픽 라이브러리를 완전히 다시 작성했습니다.
X11이 설치된 Linux에 대화형 그래픽 모드가 추가되었습니다.
2D의 합리화 시각화 버그 수정
v2.0(2023년 9월 1일) 변경 사항(다중 GPU 업그레이드)
단일 노드(PC/노트북/서버)에 (공급업체 간) 다중 GPU 지원 추가
v2.1 (15.01.2023) 변경 사항 (빠른 복셀화)
GPU에서 매우 빠른 속도로 견고한 복셀화를 만들었습니다(새로운 알고리즘, 분에서 밀리초까지)
v2.2 (20.01.2023) 변경 사항 (속도 복셀화)
회전 중심, 선형 속도 및 회전 속도를 기반으로 각 그리드 점에 대한 자동 속도 초기화를 사용하여 GPU에서 이동/회전 형상을 복셀화하는 옵션이 추가되었습니다.
재복셀화 중에 고체->유체로 변환된 세포의 DDF가 올바르게 초기화되었습니다.
음수 size
매개변수를 사용하여 read_stl(...)
중에 메시를 자동 크기 조정하지 않는 옵션을 추가했습니다.
행진 큐브를 사용한 솔리드 경계 렌더링을 위한 커널 추가
v2.3(2023.01.30) 변경 사항(파티클)
침지 경계 방법으로 입자 추가(수동 또는 양방향 결합, 단일 GPU에서만 지원됨)
GPU 복셀화 알고리즘에 대한 사소한 최적화(레이 메시 교차점을 찾은 후 메시 경계 상자 반환 외부의 작업 그룹 스레드)
표시된 GPU 메모리 할당 크기가 이제 완전히 정확합니다.
src/utilities.hpp
의 write_line()
함수 버그 수정
Linux/macOS용 .exe
파일 확장자를 제거했습니다.
v2.4(2023.11.03) 변경사항(UI 개선)
키보드/마우스 컨트롤, 시각화 설정 및 시뮬레이션 통계를 표시하는 키 H가 있는 도움말 메뉴를 추가했습니다.
키보드/마우스 제어 개선( +/- 확대 / 축소 시 마우스 클릭 시 커서가 해제/잠김)
해상도가 메모리가 허용하는 것보다 크게 설정된 경우 가능한 가장 큰 그리드 해상도 제안이 추가되었습니다.
다중 GPU 통신의 사소한 최적화(미미한 성능 차이)
온도 확장을 위한 온도 평형 함수의 버그 수정
스카이박스 색상 기능에서 Intel iGPU에 대한 잘못된 이중 리터럴을 수정했습니다.
다중 GPU 장치 ID가 실행 파일로 전달되지 않는 make.sh의 버그 수정
그래픽 엔진의 사소한 버그 수정(회전 중에 자유 커서가 중앙에 위치하지 않음, VR 모드의 레이블)
LBM::voxelize_stl()
크기 매개변수 표준 초기화의 버그 수정
v2.5(2023년 11월 4일) 변경 사항(레이트레이싱 정밀 검사)
광선 추적 그래픽을 위해 유체에 빛 흡수를 구현했습니다(성능에 영향 없음).
카메라가 유체 안에 있을 때 향상된 광선 추적 프레임 속도
고정된 스카이박스 극이 깜박이는 아티팩트
재복셀화 중에 움직이는 물체가 뒤에 단단한 그리드 셀의 잘못된 흔적을 남기는 버그가 수정되었습니다.
v2.6(2023.04.16) 변경 사항(Intel Arc 패치)
Intel Arc GPU의 OpenCL 문제 패치: 이제 4GB 이상의 VRAM 할당이 가능하며 올바른 VRAM 용량이 보고됩니다.
v2.7(2023.05.29) 변경(시각화 업그레이드)
슬라이스 시각화 추가(키 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(2023년 6월 24일) 변경 사항(문서화 + 개선)
마침내 더 많은 문서를 추가했습니다
초보자에게 더 친숙하도록 setup.cpp
의 모든 샘플 설정을 정리하고 모든 설정에 대한 주석으로 defines.hpp
에 필수 확장을 추가했습니다.
자동 메쉬 재배치를 생략하는 옵션을 추가하여 복합 .stl
형상의 로딩을 개선하고 utilities.hpp
의 Mesh
구조에 더 많은 기능을 추가했습니다.
상자 종횡비 및 VRAM 점유(MB)를 기반으로 시뮬레이션 상자 해상도를 계산하기 위해 uint3 resolution(float3 box_aspect_ratio, uint memory)
함수를 추가했습니다.
main_setup
컴퓨팅 루프에서 지정된 비디오 길이에 대한 이미지를 내보내는 bool lbm.graphics.next_frame(...)
함수를 추가했습니다.
VIS_...
매크로를 추가하여 lbm.graphics.visualization_modes
의 헤드리스 그래픽 모드에서 시각화 모드를 쉽게 설정할 수 있습니다.
시뮬레이션 상자 크기는 이제 다중 GPU 시뮬레이션을 위해 자동으로 도메인으로 균등하게 나눌 수 있습니다.
파일 로드에 대한 정보/경고/오류 메시지 형식을 수정하고 정보/경고/오류 메시지 라벨에 색상을 지정했습니다.
신체 힘과 항력 계수가 계산되는 방법에 대한 예로 Ahmed 신체 설정을 추가했습니다.
Cessna 172 및 Bell 222 설정을 추가하여 복합 .stl 형상 로드 및 움직이는 부품의 복셀화를 보여줍니다.
선택적 반투명 렌더링 모드 추가( defines.hpp
의 #define GRAPHICS_TRANSPARENCY 0.7f
)
대화형 그래픽에서 유선형 시각화의 깜박임 수정
슬라이스 모드에서 유선형의 부드러운 위치 지정이 개선되었습니다.
SURFACE
확장의 mass
및 massex
도 CPU RAM에 할당되는 버그 수정(필수 아님)
다중 GPU 모드에서 후광 데이터의 Q-criterion 렌더링 버그 수정, 도메인 간 간격 너비 감소
새로운 GPU 드라이버를 사용하는 Nvidia GPU에서 충돌이 발생하고 이전 OpenCL 1.0 GPU와 호환되지 않으므로 메시 복셀화 커널에서 공유 메모리 최적화를 제거했습니다.
주기적인 경계가 있는 시뮬레이션 상자 벽에 표면이 없을 때 고정된 광선 추적 감쇠 색상
v2.9(2023년 7월 31일) 변경 사항(멀티스레딩)
std::threads
사용하여 utilities.hpp
에 구현을 위한 크로스 플랫폼 병렬 parallel_for
추가했습니다.
멀티스레드 지오메트리 초기화 및 온전성 검사를 통해 훨씬(>4배) 더 빠른 시뮬레이션 시작
멀티스레딩을 사용하면 더 빠른 calculate_force_on_object()
및 calculate_torque_on_object()
함수
lbm.write_status()
에 총 런타임 및 LBM 런타임을 추가했습니다.
회전하는 물체를 다시 복셀화하기 위한 복셀화 광선 방향의 버그 수정
Mesh::get_bounding_box_size()
의 버그 수정
utilities.hpp
의 print_message()
함수 버그 수정
v2.10(2023년 5월 11일) 변경 사항(절두체 컬링)
시뮬레이션 상자의 일부만 표시될 때 절두체 컬링을 통해 래스터화 성능이 향상되었습니다.
중앙/자유 카메라 모드 간 전환 개선
리팩터링된 OpenCL 렌더링 라이브러리
이제 units.set_m_kg_s(...)
사용할 때 단위 변환 계수가 콘솔에 자동으로 인쇄됩니다.
FluidX3D 벤치마크의 시작 시간이 더 빨라졌습니다.
voxelize_mesh(...)
커널의 광부 버그 수정
shading(...)
느린(멀티스레딩에서) std::rand()
함수를 표준 C99 LCG로 대체했습니다.
Intel Arc GPU에 대한 잘못된 VRAM 용량 보고에 대한 보다 강력한 수정
일부 사소한 컴파일러 경고를 수정했습니다.
v2.11(2023년 7월 12일) 변경 사항(리눅스 그래픽 개선)
Linux의 대화형 그래픽도 이제 전체 화면 모드로 전환되어 Windows와 완전히 일치합니다.
std::fill
및 enqueueFillBuffer
사용하여 CPU/GPU 버퍼 초기화가 훨씬 빨라졌습니다(전체적으로 최대 8% 더 빠른 시뮬레이션 시작).
OpenCL 장치 드라이버 버전 인쇄물에 운영 체제 정보를 추가했습니다.
매우 작은 시야에서 절두체 컬링으로 깜박이는 현상이 수정되었습니다.
visualization_modes
변경될 때 렌더링/내보낸 프레임이 업데이트되지 않는 버그 수정
v2.12(2024년 1월 18일) 변경 사항(빠른 시작)
make
설치된 경우 여러 CPU 코어를 사용하여 Linux에서 소스 코드 컴파일 속도가 ~3배 빨라집니다.
훨씬 더 빠른 시뮬레이션 초기화(~40% 단일 GPU, ~15% 다중 GPU)
Memory_Container::reset()
함수의 사소한 버그 수정
v2.13(2024년 11월 2일) 변경 사항(개선된 .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(2024.03.03) 변경사항(시각화 업그레이드)
이제 Z 키를 사용하여 속도/밀도/온도 사이에서 색상을 전환할 수 있습니다.
속도/밀도/온도 시각화를 위한 균일하고 향상된 색상 팔레트
이제 자동 단위 변환 기능이 있는 색상 스케일을 H 키로 표시할 수 있습니다.
필드 시각화를 위한 슬라이스 모드는 이제 속도 벡터에 대한 선만 그리는 대신 완전히 채워진 슬라이스를 그립니다.
이제 VIS_FLAG_SURFACE
및 VIS_PHI_RASTERIZE
모드의 음영 처리가 더 매끄러워졌습니다.
make.sh
이제 Linux에서 운영 체제 및 X11 지원을 자동으로 감지하고 마지막 컴파일이 성공한 경우에만 FluidX3D를 실행합니다.
Android에서 컴파일러 경고 수정
비표준 인터프리터 경로로 인해 일부 시스템에서 make.sh
실패하는 문제를 수정했습니다.
일부 시스템에서 make
다중 코어로 컴파일되지 않는 문제가 수정되었습니다.
v2.15(2024년 4월 9일) 변경 사항(프레임 속도 향상)
Windows 및 Linux 모두에서 20-70% 더 높은 프레임 속도를 위해 렌더링 체인에서 하나의 프레임 메모리 복사본과 하나의 프레임 지우기 작업을 제거했습니다.
더 빠른 시작과 더 높은 렌더링 프레임 속도를 위해 g++
컴파일러 최적화를 활성화했습니다.
멀티스레드 온전성 검사 버그 수정
열팽창 계수에 대한 잘못된 단위 변환 수정
LBM 단위의 고정 밀도-압력 변환
레이트레이싱 커널이 시뮬레이션을 잠글 수 있는 버그를 수정했습니다.
레이트레이싱으로 사소한 시각적 아티팩트를 수정했습니다.
INTERACTIVE_GRAPHICS_ASCII
렌더링이 시작되기 전에 가끔 콘솔이 지워지지 않는 문제를 수정했습니다.
v2.16(2024.05.02) 변경사항(버그수정)
3D 보간 대신 가장자리에 1D 보간을 사용하여 10% 더 빠른 행진 큐브 구현을 단순화하여 가장자리 테이블을 제거할 수 있습니다.
가장자리가 항상 그리드 셀 사이의 중간에 있는 솔리드 표면 렌더링을 위해 더 빠르고 단순화된 행진 큐브 변형이 추가되었습니다.
OpenCL 렌더링 커널의 리팩토링
배열 범위를 벗어난 액세스로 인해 Intel OpenCL CPU 런타임에서 복셀화에 실패하는 문제를 수정했습니다.
단일 GPU와 비교하여 다중 GPU에서 복셀화가 항상 동일한 바이너리 결과를 생성하지 않는 문제를 수정했습니다.
자유 표면 시뮬레이션에서 속도 복셀화가 실패하는 문제를 수정했습니다.
fused-multiply-add( fma
)를 a*b+c
로 매크로 교체하여 ARM GPU의 끔찍한 성능을 수정했습니다.
Linux의 QWERTY
키보드 레이아웃에서 Y / Z 키가 올바르지 않은 문제를 수정했습니다.
스크롤할 때 정지 이미지에서 도움말 오버레이의 자유 카메라 이동 속도가 업데이트되지 않는 문제를 수정했습니다.
Linux-X11 대화형 그래픽이 있는 트랙패드에서 스크롤할 때 커서가 때때로 깜박이는 문제를 수정했습니다.
카메라가 움직이지 않을 때 다중 GPU를 사용한 대화형 렌더링의 깜박임 수정
일부 시스템에서 Linux 대화형 그래픽을 충돌시킬 수 있는 누락된 XInitThreads()
호출을 수정했습니다.
graphics_rasterize_phi()
와 graphics_flags_mc()
커널 사이의 z-fighting을 수정했습니다.
v2.17(2024년 5월 6일) 변경 사항(무제한 도메인 해상도)
도메인은 더 이상 42억 9천만(2³², 1624³) 그리드 셀 또는 225GB 메모리로 제한되지 않습니다. 더 많이 사용하면 OpenCL 코드가 자동으로 64비트 인덱싱으로 컴파일됩니다.
단일 GPU 시뮬레이션을 위한 새롭고 더 빠른 광선 추적 기반 현장 시각화
문서에 GPU 드라이버 및 OpenCL 런타임 설치 지침을 추가했습니다.
INTERACTIVE_GRAPHICS_ASCII
리팩토링했습니다.
floatN
, floatNxN
, doubleN
, doubleNxN
소멸자에서 메모리 누수를 수정했습니다(모두 사용되지 않음).
프레임 속도와 관계없이 카메라 이동/회전/줌 동작을 만들었습니다.
장치가 0MHz 클럭 속도를 보고하면 smart_device_selection()
이 잘못된 경고를 인쇄하는 문제를 수정했습니다.
v2.18(2024년 7월 21일) 변경 사항(추가 버그 수정)
Linux에서 높은 화면 주사율 모니터에 대한 지원 추가
문서의 보다 컴팩트한 OpenCL 런타임 설치 스크립트
OpenCL 장치를 사용할 수 없는 경우 이제 드라이버/런타임 설치 지침이 콘솔에 인쇄됩니다.
LBM::write_status()
에 도메인 정보를 추가했습니다.
uint3
입력 매개변수에 대한 LBM::index
함수 추가
최대 렌더링 거리를 10k에서 2.1M로 늘려 매우 큰 시뮬레이션이 때때로 제대로 렌더링되지 않는 문제를 수정했습니다.
Linux에서 높은 화면 새로 고침 빈도로 인해 마우스 입력이 끊기는 현상이 수정되었습니다.
OpenCL용 Intel CPU 런타임의 자유 표면 광선 추적에서 그래픽 아티팩트를 수정했습니다.
여러 lbm.run(...)
호출을 사용하는 설정에 대해 콘솔에 고정 런타임 예측이 인쇄됨
샘플 설정의 고정 밀도 진동(너무 큰 lbm_u
)
raytrace_phi()
의 사소한 그래픽 아티팩트를 수정했습니다.
ray_grid_traverse_sum()
의 사소한 그래픽 아티팩트를 수정했습니다.
빗방울 샘플 설정에서 잘못 인쇄된 시간 단계 수를 수정했습니다.
v2.19(2024년 7월 9일) 변경 사항(카메라 스플라인)
이제 카메라는 Catmull-Rom 스플라인을 사용하여 제공된 키프레임 카메라 배치 목록을 통해 부드러운 경로를 따라 날아갈 수 있습니다.
렌더링에 소요된 시간을 포함하여 더욱 정확한 남은 런타임 추정
기본적으로 FP16S 메모리 압축이 활성화되어 있습니다.
G 키를 사용하여 인쇄된 카메라 배치가 이제 쉽게 복사/붙여넣기할 수 있도록 형식화되었습니다.
인어 간트 차트를 사용하여 Readme에 벤치마크 차트를 추가했습니다.
시뮬레이션 시작 중 메모리 할당 정보를 더 나은 위치에 배치했습니다.
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 임시 ( 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 온도 ( x , t )) + 1
u ( x , t ) = 1 ∕ ρ ( x , t ) Σ i c i f i 온도 ( x , t )
f i eq-shifted ( x , t ) = wi i ρ · ( ( u ° c i ) 2 ∕ (2 c 4 ) - ( u ° u ) ∕ (2c 2 ) + ( u ° c i ) ∕ c 2 ) + 나는 ( ρ -1)
f i 온도 ( x , t +Δ t ) = f i 온도 ( x , t ) + Ω i ( f i 온도 ( x , t ), f i 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 온도 ( x , t +Δ t ) i ∈ [1, q -1]
변하기 쉬운 | SI 단위 | 방정식 정의 | 설명 |
---|---|---|---|
엑스 | 중 | x = (x,y,z) 티 | 데카르트 좌표의 3D 위치 |
티 | 에스 | - | 시간 |
ρ | kg ∕ m³ | ρ = (Σ i f i )+1 | 유체의 질량 밀도 |
피 | kg ∕ m·s² | p = c ² ρ | 유체의 압력 |
유 | m ∕ 초 | u = 1 ∕ ρ Σ i c i fi | 유체의 속도 |
ν | m² ∕ 초 | ν = μ ∕ ρ | 유체의 운동학적 전단 점도 |
μ | kg ∕ m·s | μ = ρ ν | 유체의 동적 점도 |
내가 | kg ∕ m³ | - | 이동된 밀도 분포 함수(DDF) |
Δ x | 중 | Δ x = 1 | 격자 상수(LBM 단위) |
Δt | 에스 | Δt = 1 | 시뮬레이션 시간 단계(LBM 단위) |
기음 | m ∕ 초 | c = 1 ∕ √3 Δ x ∕ Δ t | 소리의 격자 속도(LBM 단위) |
나 | 1 | 0 ≤ 나는 < q | LBM 스트리밍 방향 지수 |
큐 | 1 | q ∈ { 9,15,19,27 } | LBM 스트리밍 방향 수 |
나는 | 중 | D2Q9 / D3Q15/19/27 | LBM 스트리밍 방향 |
c 나는 | m ∕ 초 | c i = ei ∕ Δ t | LBM 스트리밍 속도 |
내가 | 1 | Σ 나는 w 나는 = 1 | LBM 속도 세트 가중치 |
Ω 나는 | kg ∕ m³ | SRT 또는 TRT | LBM 충돌 연산자 |
τ | 에스 | τ = ν ∕ c ² + Δ t ∕ 2 | LBM 휴식 시간 |
속도 세트: D2Q9, D3Q15, D3Q19(기본값), D3Q27
충돌 연산자: 단일 완화 시간(SRT/BGK)(기본값), 2단계 완화 시간(TRT)
반올림 오류를 최소화하기 위한 DDF 이동 및 기타 대수적 최적화
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????
(밀도 ?, 속도 ?, 플래그 ?, DDF ?; 각 사각형 = 1바이트)
1GB VRAM당 1,900만 셀 허용
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
가 남음
(밀도 ?, 속도 ?, 플래그 ?, DDF 사본 2개 ?/?; 각 사각형 = 1바이트)
1GB VRAM당 3백만 셀 허용
FP64가 포함된 기존 LBM(D3Q19)에는 ~344바이트/셀 필요
FluidX3D(D3Q19)에는 Esoteric-Pull+FP16을 사용하는 경우 55바이트/셀만 필요합니다.
큰 비용 절감: D3Q19 LBM의 최대 단일 GPU 그리드 해상도 비교
GPU VRAM 용량 | 1GB | 2GB | 3GB | 4GB | 6GB | 8GB | 10GB | 11GB | 12GB | 16GB | 20GB | 24GB | 32GB | 40GB | 48GB | 64GB | 80GB | 94GB | 128GB | 192GB | 256GB |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
대략적인 GPU 가격 | $25 GT210 | $25 GTX950 | $12 GTX 1060 | $50 GT730 | $35 GTX 1060 | $70 RX470 | $500 RTX 3080 | $240 GTX 1080Ti | $75 테슬라 M40 | $75 본능 MI25 | $900 RX 7900 XT | $205 테슬라 P40 | $600 본능 MI60 | $5500 A100 | $2400 RTX 8000 | $10,000 본능 MI210 | $11,000 A100 | >$40,000 H100 NVL | ? GPU 최대 1550 | ~$10,000 MI300X | - |
기존 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 | ++++ '------------------- -------' ++++ | 선택적 in- /| | 선택적 in- /| | 선택적 in- /| ++++ |/ 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) |/ ++++ .---------------------------- ------..---------. ++++ | GPU 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 서브그리드
열 DDF를 위한 Esoteric-Pull을 사용한 인플레이스 스트리밍
DDF 이동 기능을 갖춘 열 DDF용 FP16S 또는 FP16C 압축 옵션
유체 부피 모델
효율적인 곡률 계산을 위한 완전 분석 PLIC
향상된 질량 보존
stream_collide()
커널에 추가로 4개의 커널만 사용하여 매우 효율적인 구현
고체 경계에 있는 유체의 힘을 선택적으로 계산
고정된 중간 그리드 바운스백 경계(고정된 솔리드 경계)
중간 그리드 바운스백 경계 이동(단단한 경계 이동)
평형 경계(비반사 유입/유출)
온도 경계(고정 온도)
경계 유형
볼륨당 전역 힘(Guo 강제), 즉시 수정 가능
볼륨당 국지적 힘(역장)
최첨단 자유 표면 LBM(FSLBM) 구현:
열 대류를 시뮬레이션하는 열 LBM
매우 큰 레이놀즈 수를 사용하여 시뮬레이션을 안정적으로 유지하는 Smagorinsky-Lilly 서브그리드 난류 LES 모델
Π αβ = Σ i e iα e iβ ( fi - fi eq-shifted )
Q = Σ αβ Π αβ 2
______________________
τ = ½ (τ 0 + √ τ 0 2 + (16√2) ∕ ( 3π 2 ) √Q ∕ ρ )
침지 경계 방법을 사용하는 입자(수동 또는 양방향 결합, 단일 GPU만 해당)
FluidX3D는 너무 큰 시뮬레이션을 수행할 수 있으므로 나중에 렌더링하기 위해 체적 데이터를 저장하는 것은 관리하기 어렵습니다(예: 단일 프레임의 경우 120GB, 비디오의 경우 수백 TeraByte).
대신 FluidX3D를 사용하면 원시 시뮬레이션 데이터를 VRAM에서 직접 렌더링할 수 있으므로 대용량 파일을 하드 디스크로 내보낼 필요가 없습니다(내 기술 강연 참조).
렌더링이 너무 빨라서 래스터화와 레이트레이싱 모두 실시간으로 대화식으로 작동합니다.
래스터화 및 광선 추적은 OpenCL에서 수행되며 RTX/DXR 광선 추적 코어가 없거나 렌더링 하드웨어가 전혀 없는 GPU(예: A100, MI200 등)를 포함한 모든 GPU에서 작동합니다.
모니터를 사용할 수 없는 경우(예: 원격 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 런타임 설치 필요)
Intel Xeon Phi(OpenCL용 Intel CPU 런타임 설치 필요)
스마트폰 ARM GPU
네이티브 크로스 벤더 다중 GPU 구현
PCIe 통신을 사용하므로 SLI/Crossfire/NVLink/InfinityFabric이 필요하지 않습니다.
단일 노드 병렬화이므로 MPI 설치가 필요하지 않습니다.
GPU가 동일한 공급업체 제품일 필요는 없지만 비슷한 메모리 용량과 대역폭을 권장합니다.
C++17이 설치된 Windows 및 Linux에서 작동하며 macOS 및 Android에 대한 지원도 제한적입니다.
빠른 GPU 복셀화를 통해 바이너리 .stl
파일에서 삼각형 메시 가져오기 및 복셀화 지원
체적 데이터를 바이너리 .vtk
파일로 내보내기 지원
삼각형 메쉬를 바이너리 .vtk
파일로 내보내기 지원
렌더링된 이미지를 .png
/ .qoi
/ .bmp
파일로 내보내기를 지원합니다. GPU에서 시뮬레이션이 지연 없이 계속되는 동안 인코딩은 CPU에서 병렬로 실행됩니다.
다음은 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) FLOP/바이트입니다. 따라서 성능은 메모리 대역폭에 의해서만 제한됩니다. 왼쪽 3개 열의 표에는 데이터 시트에 있는 하드웨어 사양(이론적 최고 FP32 컴퓨팅 성능, 메모리 용량, 이론적 최고 메모리 대역폭)이 표시됩니다. 오른쪽 3개 열은 FP32/FP32, FP32/FP16S, FP32/FP16C 부동 소수점 정밀도 설정에 대해 측정된 FluidX3D 성능을 보여줍니다. (루프라인 모델 효율성)은 둥근 괄호 안에 표시되어 이론적 최대 메모리 대역폭이 얼마나 사용되고 있는지 나타냅니다. .
GPU/CPU가 아직 목록에 없으면 여기에서 벤치마크를 보고할 수 있습니다.