如何WebGL的或CUDA代码实际上翻译成GPU的指令?

问题描述 投票:0回答:2

当你写的WebGL或CUDA着色器和这样的,怎么是,代码实际上翻译成GPU的指令?

我想学习如何编写超级优化图形绘制到了极致,才能看到GPU指令究竟是如何执行的,在硬件/软件边界底层代码。

我的理解是,对于CUDA例如,你买他们的显卡(GPU),它以某种方式实现优化的图形操作。但随后你如何在最重要的是程序(一般意义上的),无C?

这样做的原因的问题是因为在previous question,我得到了,你不能在GPU直接使用汇编程序的意义,所以我有点糊涂了。

如果你看看像CUDA by example文档,这一切都只是C代码(虽然他们有事情像cudaMalloccudaFree,我不知道是什么在做幕后)。但引擎盖下,是c必须被编译成汇编或者至少机器代码什么的,对不对?如果是这样,如何在访问GPU?

基本上,我没有看到如何,在低于C或GLSL的水平,如何GPU本身被指示进行操作。能否请您解释一下吗?有没有装配演示它是如何工作的,或类似的东西的一些片断?还是有另一套某种在x86例如,除了16“CPU寄存器”,“GPU的寄存器”的?

cuda webgl
2个回答
2
投票

该GPU驱动程序对其进行编译的东西GPU的理解,这完全是另一回事不是x86机器代码。例如,这里有AMD R600汇编代码片段:

00 ALU: ADDR(32) CNT(4) KCACHE0(CB0:0-15)
 0 x: MUL R0.x, KC0[0].x, KC0[1].x
   y: MUL R0.y, KC0[0].y, KC0[1].y
 1 z: MUL R0.z, KC0[0].z, KC0[1].z
   w: MUL R0.w, KC0[0].w, KC0[1].w
01 EXP_DONE: PIX0, R0
END_OF_PROGRAM

的机器代码版本将会由GPU来执行。司机编排的代码转移到GPU,并指示它运行它。这的确是个特殊装置,并在NVIDIA的情况下,无证(至少没有正式记录)。

在片段中,R0是一个寄存器,但是在GPU上注册平时工作有点不同。他们“每线程”存在,并且是在一个方法(即在一个线程使用许多寄存器意味着较少的线程会同时活跃的意义上)的共享资源。为了有活跃许多线程同时(这是怎样的GPU容忍内存延时,而CPU的使用乱序执行和大缓存),图形处理器通常有寄存器数以万计。


3
投票

这些语言通过编译器翻译成机器代码。这只是编译器是各种API的驱动/运行时的一部分,是完全实现特定的。有没有我们习惯了在CPU土地的共同指令集的家庭 - 像86,手臂或什么的。不同的GPU都有着自己的不兼容insruction集。此外,没有任何的API,用以载和运行这些GPU的任意二进制文件。还有就是对于小公共可用的文件,这取决于供应商。

这样做的原因问题是因为前一个问题,我有,你不能在GPU直接使用汇编程序的意义,所以我有点糊涂了。

好了,就可以了。从理论上讲,至少。如果你不关心的事实,你的代码将只在一个小家族的ASIC的工作,如果你拥有所有必要的文件,如果你愿意实施一些接口的GPU允许运行这些二进制文件,你能行的。如果你想要去的路线,你可以看看Mesa3D project,因为它提供了许多GPU的开源驱动,包括基于LLVM编译器基础设施,以生成特定架构的二进制文件。

在实践中,存在大规模裸机GPU编程的任何有用的方式。

© www.soinside.com 2019 - 2024. All rights reserved.