我正在尝试优化NVIDIA GeForce 9800 GT图形卡的OpenCL矩阵乘法程序。我将两个512x512矩阵相乘,但我不确定我应该使用的全局和本地工作组大小。任何人都可以将我指向正确的方向吗?理想的全球/本地工作组大小(OpenCL)
回答
由于512
是两个一个电源,你可以尝试以下尺寸:
size_t global_work_size[2] = {512, 512};
size_t local_work_size[2] = {2^p, 2^n};
其中:
(2^m + 2^n) % 32 = 0
:32
一定是你数的分隔线程,作为包装将包含32
线程两个的功率需要为当地工作尺寸必须是分压器全球工作尺寸的。
大小为
512
,它肯定不会是一个问题,但你必须考虑到CL_DEVICE_MAX_WORK_GROUP_SIZE
(由clGetDeviceInfo()
给出)参数。对于更大的矩阵,您将不得不使用多于2
的尺寸。维度的数量本身有限
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS
...
事实上,最好的选择是算法依赖,并且依赖于所要执行的那种矩阵乘法。
如果您需要峰值性能,请将其与各种本地工作组大小进行基准比较,然后使用最佳值。您可能会惊讶地发现,最快的并不总是与实现的提供者给出的指导相匹配的那个!
同意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工作负载,特别是当工作负载不显示任何结构模式时,最好尝试多种组合以确保您不会错过任何内容。
准确无误。实际上,最大尺寸通常不是最大尺寸(基于寄存器文件大小),所以像(8,16),(32,4)和其他所有WIDTH * HEIGHT <= MAX的尺寸也应该被测试。 – Dithermaster 2016-04-19 16:13:32
- 1. 本地工作组大小= NULL OpenCL
- 2. OPENCL - 转移环球存储工作组+边境本地内存
- 3. OpenCL内核工作组大小限制
- 4. OpenCL NDrangekernel与3d全局大小和3d本地大小
- 5. 全球工作规模是否需要成为OpenCL中工作组大小的倍数?
- 6. OpenCL大全局大小或每个工作项目的循环?
- 7. OpenCL本地工作本地内存
- 8. OpenCL全球阵列
- 9. 在OpenCL中完全独立计算的工作大小
- 10. OpenCL:3D数组处理 - 全局大小限制
- 11. 的OpenCL工作组
- 12. 本地和全球规模对程序执行的影响 - OpenCl
- 13. OpenCL的工作组处理顺序
- 14. 计算适当数量的工作组及其大小OpenCL
- 15. OpenCL:将全局内存复制到每个工作组的本地内存
- 16. OpenCL全球工作偏移意味着性能受到影响?
- 17. 工作组大小
- 18. OpenCL使用本地工作组的图像过滤器
- 19. OpenCL:提前了解本地工作组的规模?
- 20. OpenCL何时使用全球,私人,本地,恒定的地址空间
- 21. 如何从CPU访问Compute Shader本地工作组的大小?
- 22. 以编程方式查找openCL设备支持的最大工作组大小
- 23. 作曲家安装:全球vs本地
- 24. 全球替代shell脚本不工作
- 25. OpenCL内核似乎并没有得到全球ID“全球”
- 26. OpenCL 2D工作组维度
- 27. OpenCL,多工作组/内核?
- 28. Javascript本地vs全球
- 29. 本地还是全球?
- 30. 柴/摩卡全球/本地
只要不需要中断计算以添加或修改输入,全局大小理想情况下应尽可能高,如果是这样,那么没有递减的回报来使用足够大的全局大小。尽管在实践中,如果您使用的是GPU,但它们中的大多数不支持任务并发性,因此运行内核的GPU将仅执行此操作。所以如果你使用它作为主显卡,你的屏幕将会冻结。至于本地工作的规模,它取决于内核和设备,你可以让OpenCL尝试并优化它(查看clGetKernelWorkGroupInfo) – Thomas 2013-04-10 00:43:01
请记住,Nvidia GPU将线程分组为32个线程(一个warp),因此对于合并内存访问时,您希望本地工作组大小的一个维度为32的整数倍。 – chippies 2013-04-10 12:02:16