#include "opencl_source_map.hpp" namespace MNN { const char* topkv2 = "#ifdef MNN_SUPPORT_FP16\n" "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n" "#endif\n" "#define GLOBAL_SIZE_3_DIMS " " __private const int global_size_dim0,__private const int global_size_dim1,__private const int global_size_dim2,\n" "#define DEAL_NON_UNIFORM_DIM3(input1, input2, input3) " " if (input1 >= global_size_dim0 || input2 >= global_size_dim1 || input3 >= global_size_dim2) { " " return; " " }\n" "__constant sampler_t SAMPLER=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" "#define THREAD_NUMBER 128\n" "#define LOCAL_K 8\n" "#define CANDIDATE_NUMBER (THREAD_NUMBER*LOCAL_K)\n" "#ifdef IS_INT\n" "typedef int DTYPE;\n" "typedef int4 DTYPE4;\n" "#define READ_INPUT(img,coord) read_imagei(img,SAMPLER,coord)\n" "#define WRITE_OUTPUT(img,coord,val) write_imagei(img,coord,val)\n" "#else\n" "typedef FLOAT DTYPE;\n" "typedef FLOAT4 DTYPE4;\n" "#define READ_INPUT(img,coord) RI_F(img,SAMPLER,coord)\n" "#define WRITE_OUTPUT(img,coord,val) WI_F(img,coord,val)\n" "#endif\n" "inline bool afterAsc(DTYPE aValue,int aIndex,DTYPE bValue,int bIndex) {\n" " if (aValue>bValue) return true;\n" " if (aValuebIndex;\n" "}\n" "inline bool better(DTYPE aValue,int aIndex,DTYPE bValue,int bIndex) {\n" " if (bIndex<0) return true;\n" " if (aIndex<0) return false;\n" "#ifdef SORT_DESC\n" " if (aValue>bValue) return true;\n" " if (aValuebValue) return false;\n" "#endif\n" " return aIndex= LOCAL_K) continue;\n" " for (int j=LOCAL_K-1; j>insertPos; --j) {\n" " localValue[j]=localValue[j-1];\n" " localIndex[j]=localIndex[j-1];\n" " }\n" " localValue[insertPos]=value;\n" " localIndex[insertPos]=idx;\n" " }\n" " }\n" " // Scatter to shared memory\n" " __local DTYPE sharedValue[CANDIDATE_NUMBER];\n" " __local int sharedIndex[CANDIDATE_NUMBER];\n" " const int base=tid*LOCAL_K;\n" " for (int i=0; i> 1; stride>0; stride >>= 1) {\n" " for (uint sIdx=tid; sIdx> 2;\n" " for (int c4=0; c4