cl_common.h 3.0 KB
Newer Older
L
liuruilong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

L
liuruilong 已提交
15 16
#pragma once

17 18 19
/////////////////////////////////
// fp16 enabled, MAX_VALUE, MIN_VALUE
/////////////////////////////////
L
liuruilong 已提交
20
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
L
liuruilong 已提交
21

22 23 24 25 26 27
#define MAX_VALUE FLT_MAX
#define MIN_VALUE -FLT_MAX

/////////////////////////////////
// CL_DTYPE_float / CL_DTYPE_half
/////////////////////////////////
28 29 30 31 32 33 34 35 36 37 38
// Data type: pass one of macros on host: [CL_DTYPE_float, CL_DYPE_half]
#ifdef CL_DTYPE_float
#define CL_DTYPE float
#define CL_DTYPE_CHAR f
#endif

#ifdef CL_DTYPE_half
#define CL_DTYPE half
#define CL_DTYPE_CHAR h
#endif

39 40 41
/////////////////////////////////
// GET_VEC_TYPE
/////////////////////////////////
42
// Note: macro name replacement need twice parser
Y
Yan Chunwei 已提交
43 44 45 46
#define GET_VEC_TYPE(type__, size__) type__##size__
#define VECTORIZED_TYPE(type__, size__) GET_VEC_TYPE(type__, size__)
#define CL_DTYPE4 VECTORIZED_TYPE(CL_DTYPE, 4)

47 48 49
/////////////////////////////////
// CONVERT_TYPE_TO
/////////////////////////////////
50 51 52
#define _CONVERT_TYPE_TO(value, type) convert_##type(value)
#define CONVERT_TYPE_TO(value, type) _CONVERT_TYPE_TO(value, type)

53 54 55
/////////////////////////////////
// WRITE_IMG_TYPE / READ_IMG_TYPE
/////////////////////////////////
56 57 58 59 60
#define _WRITE_IMG_TYPE(type_char, img, pos, value) \
  write_image##type_char(img, pos, value)
#define WRITE_IMG_TYPE(type_char, img, pos, value) \
  _WRITE_IMG_TYPE(type_char, img, pos, value)

61
#define _READ_IMG_TYPE(type_char, img, sampler, pos) \
62
  read_image##type_char(img, sampler, pos)
63 64
#define READ_IMG_TYPE(type_char, img, sampler, pos) \
  _READ_IMG_TYPE(type_char, img, sampler, pos)
65

66 67 68
/////////////////////////////////
// activation / activation_type4
/////////////////////////////////
Y
Yan Chunwei 已提交
69
inline CL_DTYPE activation(CL_DTYPE in
L
liuruilong 已提交
70
#ifdef PRELU
Y
Yan Chunwei 已提交
71 72
                           ,
                           CL_DTYPE prelu_alpha
L
liuruilong 已提交
73
#endif
Y
Yan Chunwei 已提交
74
                           ) {
75
  CL_DTYPE output = in;
L
liuruilong 已提交
76
#ifdef PRELU
Y
Yan Chunwei 已提交
77
  output = select(prelu_alpha * in, in, in >= (CL_DTYPE)0);
L
liuruilong 已提交
78 79 80
#endif

#ifdef RELU
Y
Yan Chunwei 已提交
81
  output = fmax(in, (CL_DTYPE)0);
L
liuruilong 已提交
82
#endif
83 84 85 86

#ifdef RELU6
  output = clamp(in, (CL_DTYPE)0, (CL_DTYPE)6);
#endif
L
liuruilong 已提交
87 88
  return output;
}
89

90 91 92 93 94 95
inline CL_DTYPE4 activation_type4(CL_DTYPE4 in
#ifdef PRELU
                                  ,
                                  CL_DTYPE4 prelu_alpha
#endif
                                  ) {
96
  CL_DTYPE4 output = in;
97 98 99 100 101 102 103
#ifdef PRELU
  output = select(prelu_alpha * in, in, in >= (CL_DTYPE4)0.0);
#endif

#ifdef RELU
  output = fmax(in, (CL_DTYPE4)0);
#endif
104 105 106 107

#ifdef RELU6
  output = clamp(in, (CL_DTYPE4)0, (CL_DTYPE4)6);
#endif
108 109
  return output;
}