42 lines
1.4 KiB
Common Lisp
42 lines
1.4 KiB
Common Lisp
#ifdef MNN_SUPPORT_FP16
|
|
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
|
|
#endif
|
|
|
|
#define GLOBAL_SIZE_2_DIMS \
|
|
__private const int global_size_dim0, __private const int global_size_dim1,
|
|
|
|
#define DEAL_NON_UNIFORM_DIM2(input1, input2) \
|
|
if (input1 >= global_size_dim0 || input2 >= global_size_dim1) { \
|
|
return; \
|
|
}
|
|
|
|
__kernel void range_buf(GLOBAL_SIZE_2_DIMS
|
|
__global const INPUT_TYPE* input0,
|
|
__global const INPUT_TYPE* input2,
|
|
__global OUTPUT_TYPE* output,
|
|
__private const int size
|
|
) {
|
|
const int x = get_global_id(0);
|
|
const int y = get_global_id(1);
|
|
|
|
DEAL_NON_UNIFORM_DIM2(x, y);
|
|
|
|
int index = x << 2;
|
|
int4 index4 = (int4)(index, index + 1, index + 2, index + 3);
|
|
INPUT_TYPE start = input0[0];
|
|
INPUT_TYPE step = input2[0];
|
|
OUTPUT_TYPE4 value = (OUTPUT_TYPE4)start + CONVERT_OUTPUT4(index4) * (OUTPUT_TYPE4)step;
|
|
#ifdef PACK_LEAVE
|
|
if(index + 3 >= size){
|
|
OUTPUT_TYPE* value_ptr = (OUTPUT_TYPE*)&value;
|
|
for(int i = 0; i < size - index; ++i){
|
|
output[index + i] = value_ptr[i];
|
|
}
|
|
}else{
|
|
#endif
|
|
vstore4(value, 0, output + index);
|
|
#ifdef PACK_LEAVE
|
|
}
|
|
#endif
|
|
}
|