【发布时间】:2014-02-12 05:51:03
【问题描述】:
我的计算机同时具有 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
显然,还有数百种其他设备需要考虑。我需要一个通用公式!
【问题讨论】:
-
我会选择
VendorId最高的那个。说真的:如果你不知道你必须执行的任务,你怎么能猜测?它可能是高度并行的(然后更多的单元可能更好)或原始的粗略计算(然后更高的时钟频率或更大的缓存可能更好)。举个例子…… -
通用公式对您没有帮助,因为公式必须猜测您希望执行的特定任务,因为某些规格适合不同的任务。
-
在这种情况下,我们需要更多的单元。这些任务是高度并行的。但是,正如您在上面看到的,NVIDIA 错误地报告了 2 个计算单元......
-
至于 正常 CPU 线程数并不是并行任务必须考虑的唯一因素(如果您不能信任报告的值,那么您就没有希望猜测使用它们)。让我再挑选几件要考虑的事情:缓存(每个任务使用多少本地数据?);内存(与 CPU 共享?与并行任务相比有多少并发访问?);指令集(我们是否需要一些特定的东西来提高速度,即使其他参数不太好?);杂项(我们是否有一些特定要求,例如 something 的大小?)。
-
简而言之:您无法以可靠的方式猜测,因为因素太多且相关。编写一个小测试(尽可能与您的任务相似)并使用 许多卡片 运行它,并使用足够大的 统计数据 您可能 从一组未知的参数中推断出一个索引。
标签: performance opencl gpgpu