这是本学期按面向对象编程课程的大作业“代码分析”报告。第一次,直面奇迹工程吧。
1.
1.1. Main Functions and Procedures
LuisaCompute(以下简称LC),其中LUISA全称为Layered and Unified Interfaces on Stream Architectures,即“流式架构上的分层统一接口“, 是一个面向图形等应用的高性能跨平台计算框架。
LC主要功能可分为如下三部分:
-
一种用于并行核函数编程的嵌入在现代C++中的领域特定语言,利用即时编译技术进行代码生成和编译。
-
一个统一的运行时库,提供资源封装器用于跨平台资源管理和命令调度。
-
多个高度优化的并行执行后端,包括CUDA、DirectX、Metal和CPU。
基本流程:
- 编写核函数,这些函数的编写是嵌入在C++代码中的,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Callable to_srgb = [](Float3 x) { $if (x <= 0.00031308f) { x = 12.92f * x; } $else { x = 1.055f * pow(x, 1.f / 2.4f) - .055f; }; return x; }; Kernel2D fill = [&](ImageFloat image) { auto coord = dispatch_id().xy(); auto size = make_float2(dispatch_size().xy()); auto rg = make_float2(coord) / size; auto srgb = to_srgb(make_float3(rg, 1.f)); image.write(coord, make_float4(srgb, 1.f)); };
|
主机端和设备端的代码逻辑从而可以集成在一起。
将C++代码编译,可以得到一个可执行程序。然而我们编写的DSL在此时并没有被执行,LC会在运行时解析并生成IR,并交给不同的后端生成代码执行。不同后端被抽象出平台无关的“资源”的概念,从而可以进行统一的编程。
1.2. Modules
LC库主要可分为如下几个模块:
-
Core:核心模块,主要包括一套专用的STL,并行原语,基础数学函数,日志等基本工具。
-
AST:抽象语法树模块,包括用于表示核函数AST的基本类型。
-
Runtime:LC的运行时部分。
-
Backends:后端模块,包括CUDA,DirectX,Metal和CPU等。