有哪些方法可以验证 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 语言......或者供应商的编译器是否理解某种形式的汇编语言,我可以使用这些语言来获取这些信息?
- 是否有等效于
cpuid
、sched_getcpu
或GetProcessorNumber
的 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
- 我试图使源代码尽可能地可移植。