OOP-Hw:LuisaCompute Code Analysis

这是本学期按面向对象编程课程的大作业“代码分析”报告。第一次,直面奇迹工程吧。

1.

1.1. Main Functions and Procedures

LuisaCompute\text{LuisaCompute}(以下简称LC{LC}),其中LUISA\text{LUISA}全称为Layered and Unified Interfaces on Stream Architectures\text{Layered and Unified Interfaces on Stream Architectures},即“流式架构上的分层统一接口“, 是一个面向图形等应用的高性能跨平台计算框架。

LC\text{LC}主要功能可分为如下三部分:

  • 一种用于并行核函数编程的嵌入在现代C++中的领域特定语言,利用即时编译技术进行代码生成和编译。

  • 一个统一的运行时库,提供资源封装器用于跨平台资源管理和命令调度。

  • 多个高度优化的并行执行后端,包括CUDA、DirectX、Metal和CPU。

基本流程:

  1. 编写核函数,这些函数的编写是嵌入在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;
// invoke the callable
auto srgb = to_srgb(make_float3(rg, 1.f));
image.write(coord, make_float4(srgb, 1.f));
};

主机端和设备端的代码逻辑从而可以集成在一起。

将C++代码编译,可以得到一个可执行程序。然而我们编写的DSL在此时并没有被执行,LC\text{LC}会在运行时解析并生成IR,并交给不同的后端生成代码执行。不同后端被抽象出平台无关的“资源”的概念,从而可以进行统一的编程。

1.2. Modules

LC\text{LC}库主要可分为如下几个模块:

  • Core\text{Core}:核心模块,主要包括一套专用的STL,并行原语,基础数学函数,日志等基本工具。

  • AST\text{AST}:抽象语法树模块,包括用于表示核函数AST\text{AST}的基本类型。

  • Runtime\text{Runtime}LC\text{LC}的运行时部分。

  • Backends\text{Backends}:后端模块,包括CUDA\text{CUDA}DirectX\text{DirectX}Metal\text{Metal}CPU\text{CPU}等。