我正在使用Cloo,一个OpenCL C#库,我想知道如何在运行时最好地确定哪个设备用于我的内核。我真正想知道的是GPU上有多少核心(计算单位*每个计算单元的核心数)。我该怎么做呢?我目前可以确定计算单位和频率。
编辑: 我曾考虑尝试在所有设备上进行配置(运行速度测试)并保存/比较结果。但是,根据我的理解,这也会带来一个问题,因为你无法编写一个最佳/公平地使用所有设备进行比较的程序。
这对于为每个内核调用选择最佳数量的工作线程也很有用。非常感谢任何帮助。
答案 0 :(得分:1)
通过核心计数来判断表现非常困难。有些核心更宽,有些核心更快。即使它们相同,不同的寄存器空间/本地存储器组合也使得它更难以猜测。
您应该拥有每个算法每个驱动程序每个驱动程序的每个图形卡性能的数据库,并将它们与当前频率相乘,或者应该在所有设备的选择或查询性能计时器进行实际加速工作之前对它们进行基准测试。
GTX680和HD7950具有相似数量的内核,但有些算法更倾向于HD7950以获得额外的%200性能,而其他一些代码则相反。
您无法查询核心数。您可以查询计算单元的数量和每个计算单元的最大线程数,但它们与性能无关,除非它们具有相同的体系结构。
您可以查询每个工作组的最佳线程数,但可以使用您使用的算法进行更改,因此您应该尝试尽可能多的值。对于标量函数的矢量化版本也是如此。如果它是一个cpu(或任何vliw gpu),它可以同时乘以4或8个数字。
有时,驱动程序的自动编译器优化与手动调优优化一样好。
https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetDeviceInfo.html