2013-04-09 45 views
1

我正在尝试优化NVIDIA GeForce 9800 GT图形卡的OpenCL矩阵乘法程序。我将两个512x512矩阵相乘,但我不确定我应该使用的全局和本地工作组大小。任何人都可以将我指向正确的方向吗?理想的全球/本地工作组大小(OpenCL)

+1

只要不需要中断计算以添加或修改输入,全局大小理想情况下应尽可能高,如果是这样,那么没有递减的回报来使用足够大的全局大小。尽管在实践中,如果您使用的是GPU,但它们中的大多数不支持任务并发性,因此运行内核的GPU将仅执行此操作。所以如果你使用它作为主显卡,你的屏幕将会冻结。至于本地工作的规模,它取决于内核和设备,你可以让OpenCL尝试并优化它(查看clGetKernelWorkGroupInfo) – Thomas 2013-04-10 00:43:01

+0

请记住,Nvidia GPU将线程分组为32个线程(一个warp),因此对于合并内存访问时,您希望本地工作组大小的一个维度为32的整数倍。 – chippies 2013-04-10 12:02:16

回答

3

由于512是两个一个电源,你可以尝试以下尺寸:

size_t global_work_size[2] = {512, 512}; 
size_t local_work_size[2] = {2^p, 2^n}; 

其中:

  • (2^m + 2^n) % 32 = 032一定是你数的分隔线程,作为包装将包含32线程

  • 两个的功率需要为当地工作尺寸必须是分压器全球工作尺寸

  • 大小为512,它肯定不会是一个问题,但你必须考虑到CL_DEVICE_MAX_WORK_GROUP_SIZE(由clGetDeviceInfo()给出)参数。对于更大的矩阵,您将不得不使用多于2的尺寸。

  • 维度的数量本身有限CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS ...

事实上,最好的选择是算法依赖,并且依赖于所要执行的那种矩阵乘法。

3

如果您需要峰值性能,请将其与各种本地工作组大小进行基准比较,然后使用最佳值。您可能会惊讶地发现,最快的并不总是与实现的提供者给出的指导相匹配的那个!

1

同意Dithermaster,我想补充一点,如果GPU不是同一型号/代,即使来自同一供应商的GPU可能具有不同的最佳工作组大小,峰值性能也是高度依赖于平台的。

为了获得最佳性能,您需要在目标平台上进行实验(预执行培训)并找到最佳配置。请记住,不仅工作组的大小,而且工作组的形状可能会显着影响性能。这就是说,你真的需要尝试所有的组合如下。假设内核的最大工作组大小为1024,这意味着对于2-D工作组,您可以具有以下组合:(1,1024),(2,512),(4,256),(8, (128,68),(16,64),(32,32),(64,16),(128,8),(256,4),(512,2)和(1024,1)。

由于内存架构,缓存架构和波形安排等方式,请注意(1,1024)和(1024,1)可能会导致完全不同的性能。

是的,当然,您还需要考虑波/扭曲大小以及合并的内存访问。在这里,我只是谈论一般的OpenCL工作负载,特别是当工作负载不显示任何结构模式时,最好尝试多种组合以确保您不会错过任何内容。

+1

准确无误。实际上,最大尺寸通常不是最大尺寸(基于寄存器文件大小),所以像(8,16),(32,4)和其他所有WIDTH * HEIGHT <= MAX的尺寸也应该被测试。 – Dithermaster 2016-04-19 16:13:32