OpenCL验证并行执行

时间:2013-09-18 22:41:26

标签: c++ c multithreading opencl gpgpu

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

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

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

硬件详细信息

  • 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标头,库和运行时)
  • 根据流程管理器的说法,英特尔的OpenCL编译器是一个铿锵的变体。
  • AMD APP OpenCL SDK(OpenCL标头,库和运行时)
  • OpenCL 1.2
  • 我试图尽可能保持源代码的可移植性。

1 个答案:

答案 0 :(得分:0)

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

CPU存在类似的事情。使用float4加热比简单的浮点更多,这显示了使用所有ALU(更不用说线程)的重要指令类型

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

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

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

简单地从起始状态看平衡状态下计算机机箱的温差。如果delta-T与opencl相似,而opencl则为5,opencl是并行化的东西,你不知道多少。