C++ 并行执行的OpenCL验证

C++ 并行执行的OpenCL验证,c++,c,multithreading,opencl,gpgpu,C++,C,Multithreading,Opencl,Gpgpu,有什么方法可以验证OpenCL确实正在并行化工作?(我如何验证工作是否被分配到所有处理元素以执行?)或至少是一种监控GPU或CPU的哪些内核/处理器正在使用的方法? 我只想用一种方法来验证OpenCL是否真的在做它的规范声称它应该做的事情。要做到这一点,我需要收集确凿的证据,证明OpenCL/操作系统/驱动程序确实在安排并行(而不是串行)执行的内核和工作项 我已经编写了一个符合OpenCLAPI1.2规范的OpenCL程序,以及一个简单的OpenCLC内核,它只需平方输入整数 在我的程序中,wo

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

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

我已经编写了一个符合OpenCLAPI1.2规范的OpenCL程序,以及一个简单的OpenCLC内核,它只需平方输入整数

在我的程序中,
work\u group\u size=MAX\u work\u group\u size
(这样它们就可以安装在计算单元上,而OpenCL就不会抛出任何错误)

工作总量是(
MAX\u COMPUTE\u UNITS*MAX\u work\u GROUP\u SIZE
)的标量倍数。由于
工作量>最大计算单位*MAX\u工作量\u组大小
,希望OpenCL

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

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

  • GPU:AMD FirePro,采用AMD Capeverd架构,7700M系列芯片组。我不知道它到底是这一系列中的哪一个。如果有一本AMD针对这种架构的指令集手册(也就是说,有x86的手册),这可能是一个开始
  • CPU:Intel(R)Core(TM)i7-3630QM CPU@2.40GHz
开发环境详细信息

  • OS:Win7 64位,最终也需要在Linux上运行,但这不是重点
  • 使用MinGW编译GNU GCC 4.8.1-std=c++11
  • 英特尔OpenCL SDK(OpenCL头、库和运行时)
  • 根据Process Manager的说法,英特尔的OpenCL编译器是一个响亮的变体
  • AMD应用程序OpenCL SDK(OpenCL头、库和运行时)
  • OpenCL1.2
  • 我正在尽可能地保持源代码的可移植性

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

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

如果GPU有一个非常好的冷却器,你可以观看它的Vdroop。负载越大,电压降越大。芯数越多,压降越大,每个芯的负载越大,压降也越大

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

使用msi after burner或类似软件是没有用的,因为即使您使用了%1张卡,它们也会显示%100的使用率


简单地看一下电脑机箱在平衡状态和起始状态的温差。如果delta-T在使用opencl时为50,而在没有opencl时为5,那么opencl是并行的,你不知道有多少。

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

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

如果GPU有一个非常好的冷却器,你可以观看它的Vdroop。负载越大,电压降越大。芯数越多,压降越大,每个芯的负载越大,压降也越大

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

使用msi after burner或类似软件是没有用的,因为即使您使用了%1张卡,它们也会显示%100的使用率

简单看电脑机箱从启动到平衡状态的温差