#include "opencl_source_map.hpp" namespace MNN { const char* gemm = "#ifdef MNN_SUPPORT_FP16\n" "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n" "#endif\n" "#define GLOBAL_SIZE_DIM2 "" __private int global_size_dim0,__private int global_size_dim1,\n" "#define UNIFORM_BOUNDRY_CHECK(index0, index1) "" if(index0 >= global_size_dim0 || index1 >= global_size_dim1) { "" return; "" }\n" "__constant sampler_t SAMPLER=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" "__kernel void gemm(__read_only image2d_t uInput,__read_only image2d_t uKernel,__write_only image2d_t uOutput,\n" " __private const int width,__private const int height,__private const int multiLength,__private const int alpha2) {\n" " \n" " int2 pos=(int2)(get_global_id(0),get_global_id(1)); \n" " if (pos.x= 4){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " WI_F(uOutput,(int2)(out_x_idx+3,out_y_idx),o3);\n" " }else if(remain == 3){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " }else if(remain == 2){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " }else if(remain == 1){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " }\n" " }\n" "}\n" "__kernel void gemmWinogradW2(__read_only image2d_t uInput,__read_only image2d_t uKernel,__write_only image2d_t uOutput,\n" " __private const int unitWidth,__private const int unitHeight,__private const int dstChannelC4,__private const int multiLength,__private const int alpha2) {\n" " \n" " int2 pos=(int2)(get_global_id(0),get_global_id(1));\n" " const int unitWidth8=(unitWidth+7)/8;\n" " if (pos.x= 8){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " WI_F(uOutput,(int2)(out_x_idx+3,out_y_idx),o3);\n" " WI_F(uOutput,(int2)(out_x_idx+4,out_y_idx),o4);\n" " WI_F(uOutput,(int2)(out_x_idx+5,out_y_idx),o5);\n" " WI_F(uOutput,(int2)(out_x_idx+6,out_y_idx),o6);\n" " WI_F(uOutput,(int2)(out_x_idx+7,out_y_idx),o7);\n" " }else if(remain == 7){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " WI_F(uOutput,(int2)(out_x_idx+3,out_y_idx),o3);\n" " WI_F(uOutput,(int2)(out_x_idx+4,out_y_idx),o4);\n" " WI_F(uOutput,(int2)(out_x_idx+5,out_y_idx),o5);\n" " WI_F(uOutput,(int2)(out_x_idx+6,out_y_idx),o6);\n" " }else if(remain == 6){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " WI_F(uOutput,(int2)(out_x_idx+3,out_y_idx),o3);\n" " WI_F(uOutput,(int2)(out_x_idx+4,out_y_idx),o4);\n" " WI_F(uOutput,(int2)(out_x_idx+5,out_y_idx),o5);\n" " }else if(remain == 5){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " WI_F(uOutput,(int2)(out_x_idx+3,out_y_idx),o3);\n" " WI_F(uOutput,(int2)(out_x_idx+4,out_y_idx),o4);\n" " }else if(remain == 4){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " WI_F(uOutput,(int2)(out_x_idx+3,out_y_idx),o3);\n" " }else if(remain == 3){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " WI_F(uOutput,(int2)(out_x_idx+2,out_y_idx),o2);\n" " }else if(remain == 2){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " WI_F(uOutput,(int2)(out_x_idx+1,out_y_idx),o1);\n" " }else if(remain == 1){\n" " WI_F(uOutput,(int2)(out_x_idx,out_y_idx),o0);\n" " }\n" " }\n" "}\n" "#ifdef INPUT_CHANNEL_LEAVE\n" " #define PADZEROSVEC(k, channel, data0, data1, data2, data3) "" data0 = (k << 2) < channel ? data0 : 0; "" data1 = (k << 2) + 1 < channel ? data1 : 0; "" data2 = (k << 2) + 2 < channel ? data2 : 0; "" data3=(k << 2)+3