在OpenCL

时间:2015-05-15 19:12:18

标签: opencl gpu

我正在使用AMD A10-7850K并且我正在编写我编写的程序的基准测试。为了大致了解缩放性能,我将模拟"模拟"通过启动2个线程而不是3个(例如)启动内核较少的CPU。我可以为GPU做些类似的事吗?

我只启动内核一次,所以我想如果有一种方法来检查一个线程正在运行的执行单元ID(或类似的东西)那么我就不能运行那个特定的GPU上的线程。

2 个答案:

答案 0 :(得分:3)

考虑到你只想运行一次内核,你有三种两种方法。以抽象的方式考虑您的内核当前处理一个工作单元:

1)第一种方法是减少全局工作量,并向内核添加一个外部循环,以便每个内核实例处理多个工作单元。例如,如果您的全局工作大小当前为4096(即要处理4096个工作单元),请将其减少到512并使用向外for循环使每个内核实例进程8个工作单元(512 * 8 = 4096)。例如,使用256的本地工作大小,这意味着您只使用两个工作组,因此使用两个GPU计算单元(512/256 = 2)。

2)另一种方法是测试你的内核,同时在后台运行另一个很长的内核。然而,这可能不会给你非常一致的结果。

3)最后,您还可以将设备划分为多个子设备,然后在这些子设备上运行内核。子设备只能有一个计算单元。

编辑:@Cicada在评论栏中引起了我的注意,截至2015年5月,AMD GPU不支持设备裂变。

答案 1 :(得分:1)

您可以尝试:

  1. 如果您运行多个工作组,则运行不同数量的工作组。
  2. 在工作组中使用较少数量的工作项。 AMD max是每个工作组256个工作项。
  3. 创建子设备(clCreateSubDevices)。即如果一个GPU包含16个处理单元,你可以将它分成2个子设备,每个子设备包含8个计算单元并使用其中一个。因为@Cicada和@faken指出设备裂变在AMD中确实不起作用GPU' S。我还在我的HD 7570上测试了它并且无法正常工作。