2

有哪些方法可以验证 OpenCL 确实正在并行化工作?(我如何验证工作是否被分配给所有处理元素以供执行?)或者至少是一种监控正在使用 GPU 或 CPU 的内核/处理器的方法?

我只是想要一种方法来验证 OpenCL 确实在做它的规范声称它应该做的事情。为此,我需要收集确凿的证据证明 OpenCL / 操作系统 / 驱动程序确实在调度内核和工作项以并行(而不是串行)执行。

我已经编写了一个符合 OpenCL API 1.2 规范的 OpenCL 程序,以及一个简单的 OpenCL C 内核,它只是简单地将输入整数平方。

在我的程序中,work_group_size = MAX_WORK_GROUP_SIZE(以便它们适合计算单元,并且 OpenCL 不会出现故障)。

总数amount_of_work是 ( MAX_COMPUTE_UNITS * MAX_WORK_GROUP_SIZE) 的标量倍数。因为amount_of_work > MAX_COMPUTE_UNITS * MAX_WORK_GROUP_SIZE,希望 OpenCL

希望这足以迫使调度程序利用可用的内核/处理器尽可能高效地执行最大数量的内核+工作项。

  • 对于 CPU,您可以检查cpuid、 或sched_getcpu、 或GetProcessorNumber以检查当前线程当前正在哪个内核/处理器上执行。
  • OpenCL API 上是否有提供此信息的方法?(我还没有找到。)
  • 是否有内置函数的 OpenCL C 语言......或者供应商的编译器是否理解某种形式的汇编语言,我可以使用这些语言来获取这些信息?
  • 是否有等效于cpuidsched_getcpuGetProcessorNumber的 GPU 用于核心使用监控等?也许某些供应商架构特定?
  • 是否有一个外部程序可以用作此信息的监视器?我已经尝试过 Process Monitor 和 AMD 的 CodeXL,这两者对于我正在寻找的东西都没有用。英特尔有 VTune,但我怀疑它是否适用于 AMD GPU。
  • 也许我可以看一下从 AMD 和 Intel 编译器生成的编译内核代码以获得一些提示?

硬件细节

  • GPU:AMD FirePro,采用 AMD Capeverde 架构,7700M 系列芯片组。我不知道它到底是系列中的哪一个。如果有这个架构的 AMD 指令集手册(即有 x86 的手册),那可能是一个开始。
  • CPU:Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz

开发环境详细信息

  • 操作系统:Win 7 64 位,最终也需要在 Linux 上运行,但这不是重点。
  • 使用 MinGW 编译GNU GCC 4.8.1 -std=c++11
  • 英特尔 OpenCL SDK(OpenCL 头文件、库和运行时)
  • 根据 Process Manager 的说法,英特尔的 OpenCL 编译器是一个 clang 变体。
  • AMD APP OpenCL SDK(OpenCL 头文件、库和运行时)
  • OpenCL 1.2
  • 我试图使源代码尽可能地可移植。
4

1 回答 1

-1

您可以注释掉程序的缓冲区副本和可视化,而不是依赖推测,只保留内核执行不变。然后把它放在一个紧密的循环中,观察热量上升。如果它像furmark一样发热,那么它正在使用核心。如果它没有加热,您也可以禁用内核中的串行操作(gid==0),然后再试一次。例如,一个简单的 nbody 模拟器将一个冷却良好的 HD7000 系列 gpu 在几分钟内推到 70°C 以上,而对于较差的冷却器则推到 90°C。将其与已知基准的温度限制进行比较。

CPU 也存在类似的情况。使用 float4 比简单的浮点数更热,这表明甚至指令类型对于使用所有 ALU 都很重要(更不用说线程了)

如果 GPU 有一个非常好的散热器,您可以观看它的 Vdroop。更多的负载意味着更多的电压降。更多核心更多下降,更多每个核心的负载也更多下降。

无论您做什么,都取决于编译器和硬件的能力,并且您无法明确控制 ALU。因为 opencl 对开发人员隐藏了硬件复杂性。

使用 msi-after burner 或类似软件没有用,因为它们显示 %100 的使用率,即使您使用 %1 的卡真正潜力。

简单看一下电脑机箱在平衡状态与启动状态的温差。如果 delta-T 就像 50 和 opencl 和 5 没有 opencl,opencl 正在并行化你不知道多少的东西。

于 2017-02-10T16:43:35.027 回答