我刚刚完成了LLVM教程(万花筒)。现在我正在计划我的第一个基于LLVM实践的项目。
我的目标是编写着色器编译器/运行时,类似于GLSL或HLSL。但我觉得很难开始。
网络上有很多论文/技巧/工具,例如https://ispc.github.io/和http://www.mesa3d.org/llvmpipe.html。但我不知道这些事情是否符合我的目标。
我在stackoverflow上搜索了一下,发现了这个:How do shader compilers work? 那篇文章的答案对我来说太笼统了。
为了使我的问题更具体,我专注于着色器的后端(运行时)。 特别是以下子问题:
假设我已经有了AST。如何生成代码以便我可以在多个数据上应用JIT-ted指令?
我想一个复杂的着色器运行时间不会像这样天真:
for(int i = 0; i < dataSetSize; ++i) {
ApplyJITtedFunction(shaderProgram, element[i]);
}
如何处理分支(if
s,while
s)?
如何组织数据集的内存布局,以便最大限度地利用数据并行性?
如何对数据集的每个元素进行计算 因此数据访问是本地的(我认为这对于一些旧的CUDA设备很重要,它的内存访问模式(例如,合并)与CPU非常不同。)?