在OpenCL中部分禁用或模拟较弱的GPU

在OpenCL中部分禁用或模拟较弱的GPU,opencl,gpu,Opencl,Gpu,我使用的是AMD10-7850K,我正在对我编写的程序进行基准测试。为了大致了解扩展性能,我通过启动2个线程而不是3个线程来“模拟”具有更少内核的CPU(例如)。我能为GPU做些类似的事情吗 我只启动内核一次,所以我想如果有办法检查线程正在运行的执行单元ID(或类似的东西),那么我就不能在GPU上运行特定的线程。考虑到您只想运行内核一次,有三种两种方法。从抽象的角度考虑,您的内核当前处理一个工作单元: 1) 第一种方法是减少全局工作大小,并向内核添加一个外部循环,以便每个内核实例处理多个工作单元

我使用的是AMD10-7850K,我正在对我编写的程序进行基准测试。为了大致了解扩展性能,我通过启动2个线程而不是3个线程来“模拟”具有更少内核的CPU(例如)。我能为GPU做些类似的事情吗

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

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

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

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

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

编辑:正如@Cicada在评论框中提到的,AMD GPU自2015年5月起不支持设备裂变。

您可以尝试:

  • 如果运行多个工作组,则运行不同数量的工作组
  • 在工作组中使用较少的工作项。AMD最大值为每个工作组256个工作项
  • 创建子设备(clCreateSubDevices)。也就是说,如果GPU包含16个处理单元,您可以将其划分为2个子设备,每个子设备包含8个计算单元,并使用其中一个。正如@Cicada和@faken指出的那样,设备裂变在AMD GPU中并不真正起作用。我也在我的HD7570上测试过它,但不起作用

  • 第三:你知道有支持设备裂变的GPU吗?:)第四:花20美元从易趣上买一张5年的显卡。@Cicada,我想大多数AMD GPU都支持设备裂变。我有一个低高清6320(集成在E-450 APU中)和一个高端(ish)高清7970(与R9 280X相同),两个都支持设备裂变。问这个问题的人有一个A10-7850K APU,它比包含HD6320的E-450 APU先进得多,所以我猜它也支持设备裂变。我还可以访问几个NVidia板,没有一个支持设备裂变,即使是最新的OpenCL1.2驱动程序。真的吗?我有一个6750,上次我检查它不支持设备裂变。无论如何,很高兴知道@Cicada,我在我提到的GPU中测试了设备裂变,事实上它不起作用。AMD GPU报告了一个有效的CL_DEVICE_PARTITION_MAX_SUB_DEVICES值,而NVidia GPU返回1,这误导了我。仔细观察就会发现CL_设备分区属性为空,所以正如您所说,AMD GPU还不支持设备裂变。然而,前两个答案仍然有效。谢谢你指出这一点。