【问题标题】:How do I know if a code is executed using GPU or CPU?我如何知道代码是使用 GPU 还是 CPU 执行的?
【发布时间】:2012-02-27 07:25:11
【问题描述】:

有什么简单的方法可以让我知道某些代码是在 GPU 而不是 CPU 中执行的?

【问题讨论】:

  • 嗯,它不是很确定,但对于 Windows,"Process Explorer" 有一个 GPU 使用图。所以要么使用它,要么找出它使用的 API。
  • 您能否更具体地说明您要在 GPU 上运行什么样的“代码”?您列出了 3 个不同的 API,它们都在 GPU 上运行“代码”,使用 3 种完全不同的方式。

标签: opengl cuda directx gpu


【解决方案1】:

我认为您需要直接了解 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 具体表达式float a = 0.5*0.7 将被执行大约零次。具体来说,编译器将在摄取程序时评估和折叠常量,并将每次出现的 a 替换为 0.35,直到遇到对 a 的赋值改变了它。
【解决方案2】:

正如 datenwolf 所说,您编写的任何通过标准编译器(gcc 等)编译的代码都将在 CPU 上运行。在 GPU 上运行的程序称为着色器。着色器中的变量类型不同于 C/C++ 程序,语法也更加严格和受限。

较旧的图形应用程序使用两种类型的着色器:顶点和片段。顶点着色器对发送到渲染器的任何几何顶点进行操作。片段着色器将接收来自顶点着色器的输出(在几何体面上进行插值),并对将绘制到屏幕的几何体的每个像素或片段进行操作。

现代图形引入了General Purpose GPU Programming 的概念。 OpenGL 的几何着色器和 Nvidia 的 CUDA 可以在 GPU 上进行通用编程。

总结一下:编译着色器在 GPU 上运行,编译后的 C/C++ 在 CPU 上运行。

【讨论】:

  • pre-shader 时代怎么样 - 什么代码在 GPU 上运行?
  • 预着色器时代也是预可编程GPU时代,因此GPU用户编写的任何代码都不会在其上运行。
【解决方案3】:

取决于您使用的操作系统以及 OpenGL/OpenCL/其他,您可以使用系统分析器为您提供此信息。系统分析器是一种跟踪系统范围活动的软件,并在跟踪完成后以可读的形式呈现。 例如,对于 Windows,您可以使用 Vtune,它同时监控 CPU 和 GPU。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2017-09-04
    • 2019-12-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2019-04-19
    • 2012-01-02
    相关资源
    最近更新 更多