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