Turing311's picture
Upload 72 files
2cc8629
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
#pragma OPENCL EXTENSION cl_khr_extended_async_copies : enable
__kernel void binarization(
const __global half *__restrict src_data,
const __global half *__restrict input_low_high,
const __global half *__restrict dst_data,
int switch_out,
int input_low_high_size,
int W,
int H)
{
__local half local_src[15 * 1024];
__local half local_dst[15 * 1024];
event_t e1 = async_work_group_copy(local_src, src_data + get_group_id(2) * W * H, W * H, 0);
wait_group_events(1, &e1);
int c = get_global_id(2);
int C = get_global_size(2);
half dst_low = switch_out ? 1.h : -1.h;
half dst_high = switch_out ? -1.h : 1.h;
half s_ilow_ihigh = input_low_high_size == 1 ? input_low_high[0] : input_low_high[c];
for (int h = 0; h < H; h++) {
__local const half *__restrict addr_src = local_src + h * W;
__local half *__restrict addr_dst = local_dst + h * W;
#if 1
for (int w = 0; w < W / 8; w++) {
half8 h_src_val8 = (*((__local half8 *)addr_src + w));
short8 cond1;
cond1.s0 = (h_src_val8.s0 <= s_ilow_ihigh);
cond1.s1 = (h_src_val8.s1 <= s_ilow_ihigh);
cond1.s2 = (h_src_val8.s2 <= s_ilow_ihigh);
cond1.s3 = (h_src_val8.s3 <= s_ilow_ihigh);
cond1.s4 = (h_src_val8.s4 <= s_ilow_ihigh);
cond1.s5 = (h_src_val8.s5 <= s_ilow_ihigh);
cond1.s6 = (h_src_val8.s6 <= s_ilow_ihigh);
cond1.s7 = (h_src_val8.s7 <= s_ilow_ihigh);
cond1 = ~(cond1 - (short8)1);
short8 res = cond1 & as_short8((half8)dst_low) | ~cond1 & as_short8((half8)dst_high);
*((__local half8 *)addr_dst + w) = as_half8(res);
}
#endif
for (int w = W & (~0x7); w < W; w++) {
addr_dst[w] = (addr_src[w] <= s_ilow_ihigh) ? dst_low : dst_high;
}
}
barrier(CLK_LOCAL_MEM_FENCE);
event_t e2 = async_work_group_copy(dst_data + get_group_id(2) * W * H, local_dst, W * H, 0);
wait_group_events(1, &e2);
}