12 #include "etl/impl/cublas/cuda.hpp" 28 template <
typename X,
typename Y>
29 void pool_2d(cudnnPoolingMode_t mode,
const X& x, Y&& y,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
30 using type = std::remove_const_t<value_t<X>>;
32 decltype(
auto) handle = start_cudnn();
34 auto pooling_desc = create_pooling_desc_wrapper(mode, c1, c2, s1, s2, p1, p2);
36 auto x_tensor = create_tensor_wrapper(x);
37 auto y_tensor = create_tensor_wrapper(y);
39 type alpha[] = {1.0f};
44 x.ensure_gpu_up_to_date();
45 y.ensure_gpu_allocated();
49 cudnn_check(cudnnPoolingForward(handle.get(), *pooling_desc, alpha, *x_tensor, x.gpu_memory(), beta, *y_tensor, y.gpu_memory()));
62 template <
typename X,
typename Y>
63 void pool_3d(cudnnPoolingMode_t mode,
const X& x, Y&& y,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
64 using type = std::remove_const_t<value_t<X>>;
66 decltype(
auto) handle = start_cudnn();
68 auto pooling_desc = create_pooling_desc_wrapper(mode, c1, c2, c3, s1, s2, s3, p1, p2, p3);
70 auto x_tensor = create_tensor_wrapper_5d(x);
71 auto y_tensor = create_tensor_wrapper_5d(y);
73 type alpha[] = {1.0f};
78 x.ensure_gpu_up_to_date();
79 y.ensure_gpu_allocated();
83 cudnn_check(cudnnPoolingForward(handle.get(), *pooling_desc, alpha, *x_tensor, x.gpu_memory(), beta, *y_tensor, y.gpu_memory()));
100 template <
typename X,
typename Y>
101 static void apply(
const X& x, Y&& y,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
103 pool_2d(CUDNN_POOLING_MAX, x, y, c1, c2, s1, s2, p1, p2);
106 for (
size_t i = 0; i < etl::dim<0>(x); ++i) {
107 apply(x(i), y(i), c1, c2, s1, s2, p1, p2);
124 template <
typename X,
typename Y>
125 static void apply(
const X& x, Y&& y,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
127 pool_2d(CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING, x, y, c1, c2, s1, s2, p1, p2);
130 for (
size_t i = 0; i < etl::dim<0>(x); ++i) {
131 apply(x(i), y(i), c1, c2, s1, s2, p1, p2);
148 template <
typename X,
typename Y>
149 static void apply(
const X& x, Y&& y,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
151 pool_3d(CUDNN_POOLING_MAX, x, y, c1, c2, c3, s1, s2, s3, p1, p2, p3);
154 for (
size_t i = 0; i < etl::dim<0>(x); ++i) {
155 apply(x(i), y(i), c1, c2, c3, s1, s2, s3, p1, p2, p3);
172 template <
typename X,
typename Y>
173 static void apply(
const X& x, Y&& y,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
175 pool_3d(CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING, x, y, c1, c2, c3, s1, s2, s3, p1, p2, p3);
178 for (
size_t i = 0; i < etl::dim<0>(x); ++i) {
179 apply(x(i), y(i), c1, c2, c3, s1, s2, s3, p1, p2, p3);
200 template <
typename X,
typename Y>
201 static void apply([[maybe_unused]]
const X& x,
202 [[maybe_unused]] Y&& y,
203 [[maybe_unused]]
size_t c1,
204 [[maybe_unused]]
size_t c2,
205 [[maybe_unused]]
size_t s1,
206 [[maybe_unused]]
size_t s2,
207 [[maybe_unused]]
size_t p1,
208 [[maybe_unused]]
size_t p2) {
209 cpp_unreachable(
"Unsupported feature called: cudnn pool");
224 template <
typename X,
typename Y>
225 static void apply([[maybe_unused]]
const X& x,
226 [[maybe_unused]] Y&& y,
227 [[maybe_unused]]
size_t c1,
228 [[maybe_unused]]
size_t c2,
229 [[maybe_unused]]
size_t s1,
230 [[maybe_unused]]
size_t s2,
231 [[maybe_unused]]
size_t p1,
232 [[maybe_unused]]
size_t p2) {
233 cpp_unreachable(
"Unsupported feature called: cudnn pool");
248 template <
typename X,
typename Y>
249 static void apply([[maybe_unused]]
const X& x,
250 [[maybe_unused]] Y&& y,
251 [[maybe_unused]]
size_t c1,
252 [[maybe_unused]]
size_t c2,
253 [[maybe_unused]]
size_t c3,
254 [[maybe_unused]]
size_t s1,
255 [[maybe_unused]]
size_t s2,
256 [[maybe_unused]]
size_t s3,
257 [[maybe_unused]]
size_t p1,
258 [[maybe_unused]]
size_t p2,
259 [[maybe_unused]]
size_t p3) {
260 cpp_unreachable(
"Unsupported feature called: cudnn pool");
275 template <
typename X,
typename Y>
276 static void apply([[maybe_unused]]
const X& x,
277 [[maybe_unused]] Y&& y,
278 [[maybe_unused]]
size_t c1,
279 [[maybe_unused]]
size_t c2,
280 [[maybe_unused]]
size_t c3,
281 [[maybe_unused]]
size_t s1,
282 [[maybe_unused]]
size_t s2,
283 [[maybe_unused]]
size_t s3,
284 [[maybe_unused]]
size_t p1,
285 [[maybe_unused]]
size_t p2,
286 [[maybe_unused]]
size_t p3) {
287 cpp_unreachable(
"Unsupported feature called: cudnn pool");
Functor for 2D Max Pooling.
Definition: max_pooling.hpp:267
Definition: bias_add.hpp:24
dyn_pool_2d_expr< detail::build_type< E >, impl::max_pool_2d > max_pool_2d(E &&value, size_t c1, size_t c2)
2D Max Pooling of the given matrix expression
Definition: dyn_pool_2d_expr.hpp:211
static constexpr size_t dimensions()
Return the number of dimensions of the expression.
Definition: traits_base.hpp:31
Functor for 2D Max Pooling.
Definition: max_pooling.hpp:192
Functor for 2D Max Pooling.
Definition: max_pooling.hpp:216
static void apply([[maybe_unused]] const X &x, [[maybe_unused]] Y &&y, [[maybe_unused]] size_t c1, [[maybe_unused]] size_t c2, [[maybe_unused]] size_t c3, [[maybe_unused]] size_t s1, [[maybe_unused]] size_t s2, [[maybe_unused]] size_t s3, [[maybe_unused]] size_t p1, [[maybe_unused]] size_t p2, [[maybe_unused]] size_t p3)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:249
static void apply([[maybe_unused]] const X &x, [[maybe_unused]] Y &&y, [[maybe_unused]] size_t c1, [[maybe_unused]] size_t c2, [[maybe_unused]] size_t c3, [[maybe_unused]] size_t s1, [[maybe_unused]] size_t s2, [[maybe_unused]] size_t s3, [[maybe_unused]] size_t p1, [[maybe_unused]] size_t p2, [[maybe_unused]] size_t p3)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:276
dyn_pool_3d_expr< detail::build_type< E >, impl::avg_pool_3d > avg_pool_3d(E &&value, size_t c1, size_t c2, size_t c3)
3D Average Pooling of the given matrix expression
Definition: dyn_pool_3d_expr.hpp:245
Utility functions for cudnn.
dyn_pool_3d_expr< detail::build_type< E >, impl::max_pool_3d > max_pool_3d(E &&value, size_t c1, size_t c2, size_t c3)
3D Max Pooling of the given matrix expression
Definition: dyn_pool_3d_expr.hpp:216
static void apply([[maybe_unused]] const X &x, [[maybe_unused]] Y &&y, [[maybe_unused]] size_t c1, [[maybe_unused]] size_t c2, [[maybe_unused]] size_t s1, [[maybe_unused]] size_t s2, [[maybe_unused]] size_t p1, [[maybe_unused]] size_t p2)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:201
Functor for 2D Max Pooling.
Definition: max_pooling.hpp:240
static void apply([[maybe_unused]] const X &x, [[maybe_unused]] Y &&y, [[maybe_unused]] size_t c1, [[maybe_unused]] size_t c2, [[maybe_unused]] size_t s1, [[maybe_unused]] size_t s2, [[maybe_unused]] size_t p1, [[maybe_unused]] size_t p2)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:225
dyn_pool_2d_expr< detail::build_type< E >, impl::avg_pool_2d > avg_pool_2d(E &&value, size_t c1, size_t c2)
2D Average Pooling of the given matrix expression
Definition: dyn_pool_2d_expr.hpp:235