#include "opencl_source_map.hpp" namespace MNN { const char* loop = "#ifdef MNN_SUPPORT_FP16\n" "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n" "#endif\n" "#define PI 3.141592653589f\n" "__constant sampler_t SAMPLER=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" "#define GLOBAL_SIZE_2_DIMS __private const int global_size_dim0,__private const int global_size_dim1,\n" "#define DEAL_NON_UNIFORM_DIM2(input1, input2) "" if (input1 >= global_size_dim0 || input2 >= global_size_dim1) { "" return; "" }\n" "__kernel void set_zero(\n" " GLOBAL_SIZE_2_DIMS\n" " __global OUTPUT_TYPE *output\n" " ) {\n" " const int x=get_global_id(0);\n" " const int y=get_global_id(1);\n" " \n" " DEAL_NON_UNIFORM_DIM2(x,y);\n" " \n" " output[y*global_size_dim0+x]=(OUTPUT_TYPE)(0);\n" "}\n" "__kernel void batch_matmul(__private int global_dim0,__private int global_dim1,__private int global_dim2,\n" " __global FLOAT* output,__global FLOAT* input_A,__global FLOAT* input_B,\n" "#ifdef BIAS\n" " __global FLOAT* input_C,\n" "#endif\n" " __global int* offset_O,__global int* offset_A,__global int* offset_B,\n" "#ifdef BIAS\n" " __global int* offset_C,\n" "#endif\n" " __private const int e,\n" " __private const int l,\n" " __private const int h,__private const int iter,\n" " __private const int4 offsets,\n" " __private const int4 iters,\n" " __private const int4 steps) {\n" " int3 pos=(int3)(get_global_id(0),get_global_id(1),get_global_id(2));\n" " if (pos.x= 0) {\n" " index.x=offset_O[pos.z];\n" " }\n" " if (iters.y >= 0) {\n" " index.y=offset_A[pos.z];\n" " }\n" " if (iters.z >= 0) {\n" " index.z=offset_B[pos.z];\n" " }\n" "#ifdef BIAS\n" " if (iters.w >= 0) {\n" " index.w=offset_C[pos.z];\n" " }\n" "#endif\n" " int4 offset=index*steps+offsets;\n" " \n" "#ifdef TRANSPOSE_A\n" " __global FLOAT* A_ptr=input_A+offset.y+pos.y;\n" "#else\n" " __global FLOAT* A_ptr=input_A+offset.y+pos.y*l;\n" "#endif\n" "#ifdef TRANSPOSE_B\n" " __global FLOAT* B_ptr=input_B+offset.z+pos.x*l;\n" "#else\n" " __global FLOAT* B_ptr=input_B+offset.z+pos.x;\n" "#endif\n" "#ifdef BIAS\n" " FLOAT4 value0=vload4(0,input_C+offset.w+pos.x);\n" " FLOAT4 value1=value0;\n" " FLOAT4 value2=value0;\n" " FLOAT4 value3=value0;\n" "#else\n" " FLOAT4 value0=(FLOAT4)0;\n" " FLOAT4 value1=(FLOAT4)0;\n" " FLOAT4 value2=(FLOAT4)0;\n" " FLOAT4 value3=(FLOAT4)0;\n" "#endif\n" " const int l_pack=(l+3) >> 2;\n" " for(int i=0; i= e) return;\n" " vstore4(value1,0,output+output_offset+h);\n" " if(pos.y+2 >= e) return;\n" " vstore4(value2,0,output+output_offset+2*h);\n" " if(pos.y+3 >= e) return;\n" " vstore4(value3,0,output+output_offset+3*h);\n" "#else\n" " if(pos.x+3= e) return;\n" " vstore4(value1,0,output+output_offset+h);\n" " if(pos.y+2 >= e) return;\n" " vstore4(value2,0,output+output_offset+2*h);\n" " if(pos.y+3 >= e) return;\n" " vstore4(value3,0,output+output_offset+3*h);\n" " }else{\n" "#if H_LEAVES == 1\n" " output[output_offset]=value0.x;\n" " if(pos.y+1 >= e) return;\n" " output[output_offset+h]=value1.x;\n" " if(pos.y+2 >= e) return;\n" " output[output_offset+2*h]=value2.x;\n" " if(pos.y+3 >= e) return;\n" " output[output_offset+3*h]=value3.x;\n" "#elif H_LEAVES == 2\n" " vstore2((FLOAT2)value0.xy,0,output+output_offset);\n" " if(pos.y+1 >= e) return;\n" " vstore2((FLOAT2)value1.xy,0,output+output_offset+h);\n" " if(pos.y+2 >= e) return;\n" " vstore2((FLOAT2)value2.xy,0,output+output_offset+2*h);\n" " if(pos.y+3 >= e) return;\n" " vstore2((FLOAT2)value3.xy,0,output+output_offset+3*h);\n" "#elif H_LEAVES == 3\n" " vstore3((FLOAT3)value0.xyz,0,output+output_offset);\n" " if(pos.y+1 >= e) return;\n" " vstore3((FLOAT3)value1.xyz,0,output+output_offset+h);\n" " if(pos.y+2 >= e) return;\n" " vstore3((FLOAT3)value2.xyz,0,output+output_offset+2*h);\n" " if(pos.y+3 >= e) return;\n" " vstore3((FLOAT3)value3.xyz,0,output+output_offset+3*h);\n" "#endif\n" " }\n" "#endif\n" " }\n" "}\n" "__kernel void tile(__private int global_dim0,__private int global_dim1,__private int global_dim2,\n" " __read_only image2d_t input,\n" " __global OUTPUT_TYPE* output,\n" " __private const int width,\n" " __private const int height,\n" " __private const int channel){\n" " int3 pos=(int3)(get_global_id(0),get_global_id(1),get_global_id(2));\n" " if (pos.x= channel)return;\n" " dst_ptr[c_dst_pitch]=value.y;\n" " if(c+2 >= channel)return;\n" " dst_ptr[2*c_dst_pitch]=value.z;\n" " if(c+3 >= channel)return;\n" " dst_ptr[3*c_dst_pitch]=value.w;\n" " }\n" "}\n" "__kernel void pack(__private int global_dim0,__private int global_dim1,__private int global_dim2,\n" " __global INPUT_TYPE* input,\n" " __write_only image2d_t output,\n" " __private const int width,\n" " __private const int height,\n" " __private const int channel){\n" " int3 pos=(int3)(get_global_id(0),get_global_id(1),get_global_id(2));\n" " if (pos.x= 0){\n" " if(offset.y >= 0 && offset.y0) || (out>0 && in1<0)) ? out+in1 : out;\n" " #else\n" " float in0=(float)input0[inputIndex0];\n" " float in1=(float)input1[inputIndex1];\n" " float out=OPERATOR;\n" " #endif\n" " if(outputIndex