为了解决之前提到的问题,我们设计了Taichi编程语言。Taichi在设计之初就注重通过提供领域特定语言抽象(domain-specific language abstractions)与编译优化(compiler optimizations)来同时达到高生产力和高性能,并满足新兴视觉计算模式的需求。其可移植性通过多后端(multiple backends)的设计来达到,包括x64,ARM,CUDA,Metal,OpenGL compute shader等。
范围(scope)
Taichi主要面向以并行for循环+命令式编程为主体的计算任务。利用多核处理器进行并行编程已成为高性能计算的主旋律,而命令式(Imperative,区别于函数式functional)的编程范式更为贴近处理器和高性能程序员的编程习惯。许多视觉计算任务的计算模式也属于这个范围。比如在图像处理、计算物理等任务中,常常需要以并行的方式遍历所有的像素(或粒子、网格、节点等),在Taichi中这些模式均可以表达为一个并行for循环。(注:类似的描述包括SIMD/SPMD/SIMT,如OpenMP parallel for、CUDA kernel等,本文不再对其中细微差异进行区分。)
尽管Taichi尽力覆盖广泛的视觉计算任务,某些计算在Taichi的应用范围之外:
具有领域特性硬件(domain-specific hardware)的任务;
粒度(granularity)足够粗以至于函数调用、数据传输的开销可忽略,并且有高度优化的库解决方案的任务。
具体来说
传统渲染任务往往有着光栅化、光线追踪硬件的支持。实时图形API,如OpenGL、DirectX、Metal、Vulkan往往已经足够适用。
视频编码、解码任务,常常有硬件编码、解码器的支持。
使用标准层(如卷积、Batch normalization等)的深度神经网络,常常已经被深度学习框架,如TensorFlow/PyTorch较好地解决。
尽管taichi并非为以上应用设计,我们确实需要考虑Taichi与以上系统的高效交互。良好设计的零拷贝(zero-copy API)通常是好的选择。比如,让OpenGL(用于渲染)的顶点着色器(vertex shader)直接读取Taichi生成的compute shader(用于模拟)的粒子位置数据是非常有帮助的。另一个例子是Taichi的PyTorch界面允许(可微)的Taichi程序深度嵌入PyTorch,使其能够直接用于深度神经网络的训练、推理之中。taichi https://taichi-lang.cn/
|