如何知道代码是使用GPU还是CPU执行的?

5

有没有简单的方法可以知道一些代码是在GPU而不是CPU上执行的?


好吧,它不是完全确定性的,但对于Windows来说,“Process Explorer”有一个GPU使用图。因此,要么使用它,要么找出它使用的API。"Process Explorer" - PeterT
3
你能具体说明你想在GPU上运行什么样的“代码”吗?你列出了3个不同的API,它们都可以使用完全不同的方式在GPU上运行“代码”。请指明。 - Nicol Bolas
3个回答

14

我认为你需要清楚CPU和GPU工作分离的概念。如果你编写并使用非针对GPU执行的常规编译器编译代码,该代码将始终在CPU上执行。

主程序中所有OpenGL或DirectX函数的调用都在CPU上执行,没有“神奇”的翻译层。但是,其中一些调用会使GPU做一些事情,例如绘制三角形。

CUDA和OpenCL是专门针对数据并行执行结构的语言。GPU就是这样的结构。但是CUDA和OpenCL代码需要一些主机程序来执行,而这些程序将在CPU上执行。可编程着色器(HLSL,GLSL)同样如此。

因此:程序的主机部分(设置工作环境,发出渲染调用或GPU执行)将在CPU上运行。在GPU上运行的代码是在单独的编译单元中编译的(即上传到OpenGL的GLSL着色器代码,使用OpenCL / CUDA编译器编译的OpenCL / CUDA代码)。


所有的glsl(.sh)代码都在GPU上运行吗?如果我需要做一些更复杂的操作,比如高斯/中值滤波怎么办?如果我写:float a=0.5*0.7; 这个会被执行多少次?每个像素一次吗?我如何控制一些并行执行的东西和一些我只想让它运行一次的东西?抱歉,我对并行执行编程还很陌生。 - flankechen
@flankechen 具体表达式 float a = 0.5*0.7 将被执行大约零次。具体来说,编译器将在处理程序时评估和折叠常量,并将用 0.35 替换每个 a 的出现,直到遇到更改该值的 a 赋值为止。 - datenwolf

2
根据您使用的操作系统,以及使用的OpenGL/OpenCL/其他技术,您可以使用系统分析工具来获取此信息。系统分析工具是一种跟踪整个系统活动并在跟踪完成后以可读形式呈现的软件。例如,对于Windows,您可以使用Vtune,它监视CPU和GPU。希望这能帮助您。

2
正如 datenwolf 所说,通过标准编译器(如 gcc 等)编译的任何代码都将在 CPU 上运行。在 GPU 上运行的程序称为着色器。着色器中的变量类型与 C/C++ 程序不同,语法也更加严格和有限。
早期的图形应用使用了两种类型的着色器:顶点着色器和片元着色器。顶点着色器操作渲染器发送的任何几何体的顶点。片元着色器会接收来自顶点着色器的输出(在几何体面上进行插值),并对绘制到屏幕上的每个像素或片元进行操作。
现代图形引入了通用GPU编程的概念。OpenGL 的几何着色器和 Nvidia 的 CUDA 可以在 GPU 上执行通用编程。
总结一下:编译的着色器在 GPU 上运行,而编译的 C/C++ 在 CPU 上运行。

前着色器时代怎么样 - 当时GPU上运行的是什么代码? - Quazi Irfan
预着色器时代也是前可编程GPU时代,因此用户编写的任何代码都无法在其上运行。 - kevintodisco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接