理想的全球/本地工作组规模(OpenCL)

时间:2013-04-09 21:15:11

标签: opencl gpgpu matrix-multiplication

我正在尝试为NVIDIA GeForce 9800 GT显卡优化OpenCL矩阵乘法程序。我将两个512x512矩阵相乘,但我不确定应该使用哪些全局和本地工作组大小。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

由于512 2的力量,您可以尝试以下尺寸:

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

其中:

  • (2^m + 2^n) % 32 = 032必须是线程数分隔符,因为换行符将包含{{1} }线程

  • 需要两个的强大功能,因为本地工作规模必须是全局工作规模的分隔符

  • 如果大小为32,则肯定不会有问题,但您必须考虑512CL_DEVICE_MAX_WORK_GROUP_SIZE}参数。对于较大的矩阵,您必须使用超过clGetDeviceInfo()个维度。

  • 尺寸数量本身受2 ...

  • 限制

确实,最佳选择取决于算法,并取决于您打算执行的矩阵乘法的类型。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

小心(1,1024)和(1024,1)可能导致完全不同的性能,这是由于内存架构,缓存架构以及wave的调度方式等等。

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