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