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