我正在尝试为NVIDIA GeForce 9800 GT显卡优化OpenCL矩阵乘法程序。我将两个512x512矩阵相乘,但我不确定应该使用哪些全局和本地工作组大小。有人能指出我正确的方向吗?
答案 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 = 0
:32
必须是线程数的分隔符,因为换行符将包含{{1} }线程
需要两个的强大功能,因为本地工作规模必须是全局工作规模的分隔符 强>
如果大小为32
,则肯定不会有问题,但您必须考虑512
(CL_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工作负载,特别是当工作负载没有显示任何结构模式时,最好尝试尽可能多的组合以确保您不会错过任何内容。