如何控制在CPU上进行哪些计算以及在GPU上进行哪些计算?


14

我目前的理解是,着色器文件中完成的所有操作都在GPU上完成,而我的Java代码(在我的情况下)完成的所有操作均在CPU上完成。

这是准确的描述吗?


2
您也可以使用类似OpenCL的工具在GPU上进行计算,这实际上使您可以在GPU上运行代码。
肥皂

Answers:


20

这就是要旨。

原则上,该平台可以想像地做任何它想做的事情。可以想象有一种先进的操作系统可以实时将编译后的代码从x86转换为GPU代码。同样,OpenGL驱动程序可以在主机CPU上运行所需的任何内容。

但是实际上,您刚刚描述的是发生了什么。


5
IIRC,着色器在发送到GPU之前在CPU上进行编译。这是由没有操作系统的GPU驱动程序完成的。
MSalters 2015年

真正。即使在已编译Java代码的情况下,在着色器中运行程序期间,我也处理了许多编译错误。
Bassinator 2015年

1
理论上:假设我有一个程序,它占用大量CPU,但是只是一个命令行界面(没有图形功能)。我可以将一些工作转移到GPU吗?我实际上并不打算这样做,这只是我感兴趣的概念性事情。
Bassinator 2015年

2
是! @return true发布的链接是用于执行此操作的Java库的。通常,您可以在OpenGL中编写“计算着色器”,或使用OpenCL。在所有情况下,您都需要隔离可并行化的部分代码,并将信息传入和传出。(GPU最适合执行“令人尴尬的并行”任务。)
david van

1
要添加到此答案的一个星号是,某些实现支持“预着色器”的思想-即,代码是着色器的一部分,但是在给定的绘制调用中,其结果在所有调用中将保持不变(例如,乘以统一视图)和投影矩阵)。如此倾斜的着色器编译器可以识别这样的代码位,并将其提升到CPU端一次执行,包括在提交给GPU的工作中得到的恒定输出。这是一种常见的情况,尽管可能只是详细介绍了“ shader = GPU”假设。
DMGregory

7

通常,是的。Java用于编写在cpu上运行的程序。着色器语言(cg,hlsl等)用于编写在gpu上运行的程序。

该规则的一个例外是使用可以弥合差距的第三方api


1
非常有趣的提示,您指向“ aparapi”的链接。在GPU上运行一些JVM代码……很有趣!
大卫

3

David Van Brink回答了您的问题。

但是就像他说的那样,OpenGL驱动程序可以在CPU上运行某些东西,实际上它经常发生。特别是在兼容性上下文中,某些奇怪的旧功能无法在图形卡上实现。他们需要软件仿真。例如,我听说在CPU上执行点画之前。您也可以期待采摘带来的惊喜。
在MacOS上使用2.1上下文时,这些意外可能会发生更多,因为苹果已经在其硬件范围内很好地统一了OpenGL的视图,并且一些较小的硬件缺少一些必须模拟的东西。如果上下文创建代码明确指定了软件设备,则实际上可以在CPU上完全执行整个OpenGL 2.1规范。

相反,可以根据API设置标志在GPU或CPU上执行通过计算库(如vexcl或boost计算,或Microsoft的AMP或nVidia推力)执行的代码。

为了画龙点睛,CPU内部还具有DSP架构,其中一部分被称为SIMD。英特尔的ispc编译器为生成“确保”在SIMD通道上运行的代码提供了帮助,并在编译时提供了许多性能诊断,以帮助您充分利用它。将OpenMP添加到其中,您将获得多线程SIMD,它接近于GPU的概念。如果您具有高端CPU和低端GPU,那么实际上可以提高性能。
http://ispc.github.io/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.