- opencl/
- Opencl 估计GPU矩阵计算的最佳分片大小
Opencl 估计GPU矩阵计算的最佳分片大小
Opencl 估计GPU矩阵计算的最佳分片大小,opencl,sycl,Opencl,Sycl,我已经用SYCL编写了一个矩阵乘法内核,它基于将子矩阵平铺到本地缓存。我使用平铺(平铺尺寸16x16)和不使用平铺(朴素)方法获得的性能提升高达2倍
对于较低的瓷砖尺寸,我接近天真的速度,这是意料之中的。对于任何大于16的平铺大小(我会选择2的幂,因为我的矩阵大小也是如此),比如32,内核抛出一个sycl异常
我怀疑这是因为GPU无法在其本地缓存上容纳更高的磁贴大小
问题:
如何动态确定(并设置)在不同GPU上部署支持的最大磁贴大小
对于Intel GPU,如何确定最大GPU本地缓存大小
我试着
我已经用SYCL编写了一个矩阵乘法内核,它基于将子矩阵平铺到本地缓存。我使用平铺(平铺尺寸16x16)和不使用平铺(朴素)方法获得的性能提升高达2倍
对于较低的瓷砖尺寸,我接近天真的速度,这是意料之中的。对于任何大于16的平铺大小(我会选择2的幂,因为我的矩阵大小也是如此),比如32,内核抛出一个sycl异常
我怀疑这是因为GPU无法在其本地缓存上容纳更高的磁贴大小
问题:
如何动态确定(并设置)在不同GPU上部署支持的最大磁贴大小
对于Intel GPU,如何确定最大GPU本地缓存大小
我试着检查ark.intel.com,但没有列出GPU本地缓存大小。
当前设置:配备Intel UHD 620的i7-8665U
附言:如果你想看我的内核代码,请添加评论,我会添加。我目前觉得没有必要在文章中显示内核代码和膨胀。通常在矩阵乘法平铺中,有几件事需要注意:
每个线程的磁贴大小-由于您需要将数据保存在寄存器中,例如NVidia,它大约为256-因此自动生成的磁贴大小不能超过16x16-实际上,6x6/8x8是每个线程NVidia/amd/intel GPU的最佳选择
最好是将较大的磁贴(如128x128或72x72(对于AMD))加载到本地内存,并将工作组中每个线程的工作负载分配到较小的磁贴上——但在避免组冲突时应非常小心
最佳参数选择取决于gpu供应商(amd/nvidia/intel/arm mali等)、gpu版本/代数,当然还有矩阵大小。例如,CLBlast具有用于矩阵乘法参数选择的复杂调优例程
因此,为了选择最佳参数,您需要查看amd/nvidia/intel gpu(64或32/32/8-32)的波前/wrap/simd大小、本地内存库数量、每个线程的寄存器计数等。通常,可以使用自动调整和缓存这些值来完成
我发现本教程非常有助于理解快速矩阵乘法的各种问题:
即使在那里,他也获得了大约50-60%的效率。实现好的矩阵乘法算法很困难
这是特定于英特尔的教程:在矩阵乘法平铺中,通常需要注意以下几点:
每个线程的磁贴大小-由于您需要将数据保存在寄存器中,例如NVidia,它大约为256-因此自动生成的磁贴大小不能超过16x16-实际上,6x6/8x8是每个线程NVidia/amd/intel GPU的最佳选择
最好是将较大的磁贴(如128x128或72x72(对于AMD))加载到本地内存,并将工作组中每个线程的工作负载分配到较小的磁贴上——但在避免组冲突时应非常小心
最佳参数选择取决于gpu供应商(amd/nvidia/intel/arm mali等)、gpu版本/代数,当然还有矩阵大小。例如,CLBlast具有用于矩阵乘法参数选择的复杂调优例程
因此,为了选择最佳参数,您需要查看amd/nvidia/intel gpu(64或32/32/8-32)的波前/wrap/simd大小、本地内存库数量、每个线程的寄存器计数等。通常,可以使用自动调整和缓存这些值来完成
我发现本教程非常有助于理解快速矩阵乘法的各种问题:
即使在那里,他也获得了大约50-60%的效率。实现好的矩阵乘法算法很困难
这是英特尔特有的教程:@Artyom解释了在GPU上实现矩阵乘法时需要注意的事项
关于这些问题,以下是SYCL中的片段,它们显示了我在寻找什么:
//使用设备创建队列
默认_选择器d_选择器;
队列q(d_选择器,dpc_公共::异常处理程序);
在GPU上实现矩阵乘法时,Artyom对需要注意的事项给出了解释
关于这些问题,以下是SYCL中的片段,它们显示了我在寻找什么:
//使用设备创建队列
默认_选择器d_选择器;
队列q(d_选择器,dpc_公共::异常处理程序);
标准::cout