88#define SIGNED_SATURATE_MAX 2047
99#define SIGNED_SATURATE_MIN -2048
1010#define UNSIGNED_SATURATE_MAX 4095
11+ #define SIGNED_8BIT_SATURATE_MAX 127
12+ #define SIGNED_8BIT_SATURATE_MIN -128
13+ #define UNSIGNED_8BIT_SATURATE_MAX 255
1114
1215namespace caffe {
1316
@@ -97,13 +100,27 @@ __global__ void AvePoolForward(const int nthreads,
97100 if (top_data[index] < 0 )
98101 top_data[index] = 0 ;
99102 }
103+ if (saturate == PoolingParameter_SaturateMethod_Unsigned_8bit)
104+ {
105+ if (top_data[index] > UNSIGNED_8BIT_SATURATE_MAX)
106+ top_data[index] = UNSIGNED_8BIT_SATURATE_MAX;
107+ if (top_data[index] < 0 )
108+ top_data[index] = 0 ;
109+ }
100110 if (saturate == PoolingParameter_SaturateMethod_Signed)
101111 {
102112 if (top_data[index] > SIGNED_SATURATE_MAX)
103113 top_data[index] = SIGNED_SATURATE_MAX;
104114 if (top_data[index] < SIGNED_SATURATE_MIN)
105115 top_data[index] = SIGNED_SATURATE_MIN;
106116 }
117+ if (saturate == PoolingParameter_SaturateMethod_Signed_8bit)
118+ {
119+ if (top_data[index] > SIGNED_8BIT_SATURATE_MAX)
120+ top_data[index] = SIGNED_8BIT_SATURATE_MAX;
121+ if (top_data[index] < SIGNED_8BIT_SATURATE_MIN)
122+ top_data[index] = SIGNED_8BIT_SATURATE_MIN;
123+ }
107124 }
108125 else {
109126 if (saturate == PoolingParameter_SaturateMethod_Unsigned)
@@ -114,6 +131,14 @@ __global__ void AvePoolForward(const int nthreads,
114131 if (top_data[index] < 0 )
115132 top_data[index] = 0 ;
116133 }
134+ else if (saturate == PoolingParameter_SaturateMethod_Unsigned_8bit)
135+ {
136+ top_data[index] = aveval;
137+ if (top_data[index] > UNSIGNED_8BIT_SATURATE_MAX)
138+ top_data[index] = UNSIGNED_8BIT_SATURATE_MAX;
139+ if (top_data[index] < 0 )
140+ top_data[index] = 0 ;
141+ }
117142 else if (saturate == PoolingParameter_SaturateMethod_Signed)
118143 {
119144 top_data[index] = aveval;
@@ -122,6 +147,14 @@ __global__ void AvePoolForward(const int nthreads,
122147 if (top_data[index] < SIGNED_SATURATE_MIN)
123148 top_data[index] = SIGNED_SATURATE_MIN;
124149 }
150+ else if (saturate == PoolingParameter_SaturateMethod_Signed_8bit)
151+ {
152+ top_data[index] = aveval;
153+ if (top_data[index] > SIGNED_8BIT_SATURATE_MAX)
154+ top_data[index] = SIGNED_8BIT_SATURATE_MAX;
155+ if (top_data[index] < SIGNED_8BIT_SATURATE_MIN)
156+ top_data[index] = SIGNED_8BIT_SATURATE_MIN;
157+ }
125158 else // original implementation
126159 top_data[index] = aveval / pool_size;
127160 }
@@ -248,13 +281,27 @@ __global__ void AvePoolForward_TF(const int nthreads,
248281 if (top_data[index] < 0 )
249282 top_data[index] = 0 ;
250283 }
284+ if (saturate == PoolingParameter_SaturateMethod_Unsigned_8bit)
285+ {
286+ if (top_data[index] > UNSIGNED_8BIT_SATURATE_MAX)
287+ top_data[index] = UNSIGNED_8BIT_SATURATE_MAX;
288+ if (top_data[index] < 0 )
289+ top_data[index] = 0 ;
290+ }
251291 if (saturate == PoolingParameter_SaturateMethod_Signed)
252292 {
253293 if (top_data[index] > SIGNED_SATURATE_MAX)
254294 top_data[index] = SIGNED_SATURATE_MAX;
255295 if (top_data[index] < SIGNED_SATURATE_MIN)
256296 top_data[index] = SIGNED_SATURATE_MIN;
257297 }
298+ if (saturate == PoolingParameter_SaturateMethod_Signed_8bit)
299+ {
300+ if (top_data[index] > SIGNED_8BIT_SATURATE_MAX)
301+ top_data[index] = SIGNED_8BIT_SATURATE_MAX;
302+ if (top_data[index] < SIGNED_8BIT_SATURATE_MIN)
303+ top_data[index] = SIGNED_8BIT_SATURATE_MIN;
304+ }
258305 }
259306
260307 else {
@@ -266,6 +313,14 @@ __global__ void AvePoolForward_TF(const int nthreads,
266313 if (top_data[index] < 0 )
267314 top_data[index] = 0 ;
268315 }
316+ else if (saturate == PoolingParameter_SaturateMethod_Unsigned_8bit)
317+ {
318+ top_data[index] = aveval;
319+ if (top_data[index] > UNSIGNED_8BIT_SATURATE_MAX)
320+ top_data[index] = UNSIGNED_8BIT_SATURATE_MAX;
321+ if (top_data[index] < 0 )
322+ top_data[index] = 0 ;
323+ }
269324 else if (saturate == PoolingParameter_SaturateMethod_Signed)
270325 {
271326 top_data[index] = aveval;
@@ -274,6 +329,14 @@ __global__ void AvePoolForward_TF(const int nthreads,
274329 if (top_data[index] < SIGNED_SATURATE_MIN)
275330 top_data[index] = SIGNED_SATURATE_MIN;
276331 }
332+ else if (saturate == PoolingParameter_SaturateMethod_Signed_8bit)
333+ {
334+ top_data[index] = aveval;
335+ if (top_data[index] > SIGNED_8BIT_SATURATE_MAX)
336+ top_data[index] = SIGNED_8BIT_SATURATE_MAX;
337+ if (top_data[index] < SIGNED_8BIT_SATURATE_MIN)
338+ top_data[index] = SIGNED_8BIT_SATURATE_MIN;
339+ }
277340 else // original implementation
278341 top_data[index] = aveval / pool_size;
279342 }
0 commit comments