performance - 如何选择最强大的OpenCL设备?

标签 performance opencl gpgpu

我的电脑有 Intel GPU 和 NVIDIA GPU。后者功能更强大,是我执行繁重任务时的首选设备。我需要一种方法来以编程方式确定要使用的设备之一。

我知道很难知道哪种设备最适合特定任务。我需要的是(以编程方式)做一个合格的猜测 使用下面列出的变量。

您如何对这两款设备进行排名? Intel HD Graphics 4400向左,GeForce GT 750M向右。

GlobalMemoryCacheLineSize               64 vs 128
GlobalMemoryCacheSize              2097152 vs 32768
GlobalMemorySize                1837105152 vs 4294967296
HostUnifiedMemory                     true vs false
Image2DMaxHeight                     16384 vs 32768
Image2DMaxWidth                      16384 vs 32768
Image3DMaxDepth                       2048 vs 4096
Image3DMaxHeight                      2048 vs 4096
Image3DMaxWidth                       2048 vs 4096
LocalMemorySize                      65536 vs 49152
MaxClockFrequency                      400 vs 1085
MaxComputeUnits                         20 vs 2
MaxConstantArguments                     8 vs 9
MaxMemoryAllocationSize          459276288 vs 1073741824
MaxParameterSize                      1024 vs 4352
MaxReadImageArguments                  128 vs 256
MaxSamplers                             16 vs 32
MaxWorkGroupSize                       512 vs 1024
MaxWorkItemSizes           [512, 512, 512] vs [1024, 1024, 64]
MaxWriteImageArguments                   8 vs 16
MemoryBaseAddressAlignment            1024 vs 4096
OpenCLCVersion                         1.2 vs 1.1
ProfilingTimerResolution                80 vs 1000
VendorId                             32902 vs 4318

显然,还有数百种其他设备需要考虑。我需要一个通用公式!

最佳答案

您不能有一个简单的公式来根据该参数计算索引。

解释

首先让我假设您可以信任收集的数据,当然如果您阅读 MaxComputeUnits 的 2但实际上它是 80,那么您无能为力(除非您拥有自己的卡片数据库以及所有规范)。

如果您不知道必须执行的任务,您如何猜测?它可能是高度并行的(然后更多的单元可能更好)或原始的蛮力计算(然后更高的时钟频率或更大的缓存可能更好)。至于正常的 CPU 线程数并不是并行任务必须考虑的唯一因素。仅提及您必须考虑的几件事:

  • 缓存:每个任务使用多少本地数据?
  • 内存:与CPU共享?与并行任务相比,有多少并发访问?
  • 指令集:即使其他参数不太好,您是否需要一些特定的东西来提高速度?
  • 杂项:您是否有一些特定要求,例如必须支持的东西的大小和回退方法使一切变得非常慢?

  • 简而言之:您无法以可靠的方式计算索引,因为因素太多并且它们之间具有很强的相关性(例如,小缓存或缓慢的内存访问可能会减慢高并行度,但如果支持特定指令,则可能即使所有其他参数都很差,也能为您提供出色的性能)。

    一种可能的解决方案

    如果您需要原始比较,您甚至可以简单地做 MaxComputeUnits * MaxClockFrequency (对于许多应用程序甚至可能已经足够了)但是如果您需要一个更准确的索引,那么不要认为这将是一件容易的事,您将得到一个通用公式,如 (a + b / 2)^2 ,它不是,结果将非常特定于您必须完成的任务。

    编写一个小测试(尽可能与您的任务相似,请查看 this post on SO )并使用 运行它多卡 ,带够大统计您可以 外推来自一组未知参数的索引。算法可能会变得非常复杂,并且有大量关于这个主题的文献,所以我什至不会在这里重复它们。我会从 Wikipedia article 开始作为其他更具体论文的总结。如果你需要一个你必须做的例子,你可以阅读 Exploring the Multiple-GPU Design Space .

    请记住,您添加到研究中的变量越多,结果质量就越不稳定,您使用的参数越少,结果就越准确。为了更好地支持外推:
  • 收集足够的数据后,您应该首先select and reduce variables对其中的一个子集进行一些预分析,仅包括对您的基准测试结果影响更大的因素(例如 MaxGroupSize 可能不那么相关)。这个阶段非常重要,应该使用统计工具做出决定(例如,您可以计算 p 值)。
  • 某些参数可能具有很大的可变性(内存大小、单位数),但使用较少的值(例如 [0..5) 单位、[5..10) 单位、[10..*) 单位] 会更容易分析.那么你应该分区数据 (观察它们的分布)。不同的分区可能会导致非常不同的结果,因此您应该尝试不同的组合。

  • 还有很多其他的事情需要考虑,一本关于数据挖掘的好书可以帮助你在这里写 1000 多字。

    关于performance - 如何选择最强大的OpenCL设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278403/

    相关文章:

    python - 如何检查列表列表中的所有元素是否都是字符串

    performance - 为什么(在 MATLAB 中)这段代码更快?

    mysql - 组合快速 MySQL 查询性能缓慢

    java - 与Windows台式机相比,Java在Linux服务器中的运行速度较慢

    c++ - 错误 : clBuildProgram(CL_BUILD_PROGRAM_FAILURE)

    c++ - 以编程方式找出 openCL 设备支持的最大工作组大小

    opencl - 普通内存对象和OpenCL的管道有什么不同?

    windows - 在 Mingw Nvidia SDK 上编译 OpenCL

    algorithm - 1 除以一个大整数

    cuda - CUDA 是否会自动为您进行负载平衡?