Files
2026-07-13 13:33:03 +08:00

115 lines
3.7 KiB
C++

#include "opencl_source_map.hpp"
namespace MNN {
#ifndef MNN_OPENCL_BUFFER_CLOSED
const char* rope_buf =
"#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"
"#define C4_OFFSET(token,channel,seqLen) (((channel)/4)*(seqLen)*4+(token)*4+((channel) % 4))\n"
"__kernel void rope_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* q,__global const FLOAT* k,__global const FLOAT* cos,\n"
" __global const FLOAT* sin,__global FLOAT* q_out,__global FLOAT* k_out,\n"
" __private const int outerSize,__private const int halfD,__private const int ropeHalfD,\n"
" __private const int headDim,__private const int numHead,__private const int kvNumHead\n"
"#ifdef Q_NORM\n"
" ,\n"
" __global const float* qGamma,__private const float qEps\n"
"#endif\n"
"#ifdef K_NORM\n"
" ,\n"
" __global const float* kGamma,__private const float kEps\n"
"#endif\n"
") {\n"
" const int x=get_global_id(0);\n"
" const int y=get_global_id(1);\n"
" const int z=get_global_id(2);\n"
" DEAL_NON_UNIFORM_DIM3(x,y,z);\n"
" const int fullHead=numHead+kvNumHead;\n"
"#if defined(Q_NORM) || defined(K_NORM)\n"
" if (x >= 1 || y >= outerSize || z >= fullHead) {\n"
" return;\n"
" }\n"
"#else\n"
" if (x >= halfD || y >= outerSize || z >= fullHead) {\n"
" return;\n"
" }\n"
"#endif\n"
" const int D=headDim;\n"
" bool isQ=(z<numHead);\n"
" __global const FLOAT* in_ptr=isQ ? q : k;\n"
" const int inBase=isQ ? (z*D) : ((z-numHead)*D);\n"
" __global FLOAT* out_ptr=isQ ? (q_out+(y*numHead+z)*D) : (k_out+(y*kvNumHead+z-numHead)*D);\n"
" float var=0.0f;\n"
"#ifdef Q_NORM\n"
" if (isQ) {\n"
" for (int i=0; i<D; ++i) {\n"
" float val=(float)in_ptr[C4_OFFSET(y,inBase+i,outerSize)];\n"
" var += val*val;\n"
" }\n"
" var=1.0f/sqrt(var/D+qEps);\n"
" }\n"
"#endif\n"
"#ifdef K_NORM\n"
" if (!isQ) {\n"
" for (int i=0; i<D; ++i) {\n"
" float val=(float)in_ptr[C4_OFFSET(y,inBase+i,outerSize)];\n"
" var += val*val;\n"
" }\n"
" var=1.0f/sqrt(var/D+kEps);\n"
" }\n"
"#endif\n"
"#if defined(Q_NORM) || defined(K_NORM)\n"
" for (int i=0; i<halfD; ++i) {\n"
" const int cosIndex=y*headDim+i;\n"
" FLOAT cEven=cos[cosIndex];\n"
" FLOAT cOdd=cos[cosIndex+halfD];\n"
" FLOAT sEven=sin[cosIndex];\n"
" FLOAT sOdd=sin[cosIndex+halfD];\n"
" FLOAT evenVal=in_ptr[C4_OFFSET(y,inBase+i,outerSize)];\n"
" FLOAT oddVal=in_ptr[C4_OFFSET(y,inBase+i+halfD,outerSize)];\n"
"#ifdef Q_NORM\n"
" if (isQ) {\n"
" evenVal=(FLOAT)((float)evenVal*var*qGamma[i]);\n"
" oddVal=(FLOAT)((float)oddVal*var*qGamma[i+halfD]);\n"
" }\n"
"#endif\n"
"#ifdef K_NORM\n"
" if (!isQ) {\n"
" evenVal=(FLOAT)((float)evenVal*var*kGamma[i]);\n"
" oddVal=(FLOAT)((float)oddVal*var*kGamma[i+halfD]);\n"
" }\n"
"#endif\n"
" if (i<ropeHalfD) {\n"
" FLOAT v0=evenVal*cEven-oddVal*sEven;\n"
" FLOAT v1=oddVal*cOdd+evenVal*sOdd;\n"
" out_ptr[i]=v0;\n"
" out_ptr[i+halfD]=v1;\n"
" } else {\n"
" out_ptr[i]=evenVal;\n"
" out_ptr[i+halfD]=oddVal;\n"
" }\n"
" }\n"
"#else\n"
" const int cosIndex=y*headDim+x;\n"
" FLOAT cEven=cos[cosIndex];\n"
" FLOAT cOdd=cos[cosIndex+halfD];\n"
" FLOAT sEven=sin[cosIndex];\n"
" FLOAT sOdd=sin[cosIndex+halfD];\n"
" FLOAT evenVal=in_ptr[C4_OFFSET(y,inBase+x,outerSize)];\n"
" FLOAT oddVal=in_ptr[C4_OFFSET(y,inBase+x+halfD,outerSize)];\n"
" if (x<ropeHalfD) {\n"
" FLOAT v0=evenVal*cEven-oddVal*sEven;\n"
" FLOAT v1=oddVal*cOdd+evenVal*sOdd;\n"
" out_ptr[x]=v0;\n"
" out_ptr[x+halfD]=v1;\n"
" } else {\n"
" out_ptr[x]=evenVal;\n"
" out_ptr[x+halfD]=oddVal;\n"
" }\n"
"#endif\n"
"}\n"
;
#endif
}