| 350 | |
| 351 | template <typename T> |
| 352 | void run_dropout(Handle* handle) { |
| 353 | using ctype = typename DTypeTrait<T>::ctype; |
| 354 | auto run = [&](TensorShape shape, float drop_prob) { |
| 355 | auto fwd = handle->create_operator<DropoutForward>(); |
| 356 | auto bwd = handle->create_operator<DropoutBackward>(); |
| 357 | fwd->param().drop_prob = drop_prob; |
| 358 | bwd->param().drop_prob = drop_prob; |
| 359 | double scale = 1.0 / (1.0 - drop_prob); |
| 360 | |
| 361 | TensorLayout inp_lay{shape, T()}; |
| 362 | TensorLayout oup_lay{shape, T()}; |
| 363 | TensorLayout mask_lay{{fwd->get_mask_size_in_bytes(inp_lay)}, dtype::Byte()}; |
| 364 | TensorLayout doup_lay{shape, T()}; |
| 365 | TensorLayout dinp_lay{shape, T()}; |
| 366 | TensorLayout fwd_ws_lay{ |
| 367 | {fwd->get_workspace_in_bytes(inp_lay, oup_lay, mask_lay)}, |
| 368 | dtype::Byte()}; |
| 369 | TensorLayout bwd_ws_lay{ |
| 370 | {bwd->get_workspace_in_bytes(doup_lay, mask_lay, dinp_lay)}, |
| 371 | dtype::Byte()}; |
| 372 | |
| 373 | SyncedTensor<ctype> inp(handle, inp_lay); |
| 374 | SyncedTensor<ctype> oup(handle, oup_lay); |
| 375 | SyncedTensor<DTypeTrait<dt_byte>::ctype> mask(handle, mask_lay); |
| 376 | SyncedTensor<ctype> doup(handle, doup_lay); |
| 377 | SyncedTensor<ctype> dinp(handle, dinp_lay); |
| 378 | SyncedTensor<DTypeTrait<dt_byte>::ctype> fwd_ws(handle, fwd_ws_lay); |
| 379 | SyncedTensor<DTypeTrait<dt_byte>::ctype> bwd_ws(handle, bwd_ws_lay); |
| 380 | |
| 381 | for (size_t i = 0; i < inp.layout().total_nr_elems(); ++i) { |
| 382 | inp.ptr_mutable_host()[i] = 1; |
| 383 | doup.ptr_mutable_host()[i] = 1; |
| 384 | } |
| 385 | |
| 386 | fwd->exec( |
| 387 | inp.tensornd_dev(), oup.tensornd_dev(), mask.tensornd_dev(), |
| 388 | {fwd_ws.ptr_mutable_dev(), fwd_ws.layout().total_nr_elems()}); |
| 389 | size_t droped_cnt = 0; |
| 390 | for (size_t i = 0; i < inp.layout().total_nr_elems(); ++i) { |
| 391 | ASSERT_TRUE( |
| 392 | oup.ptr_host()[i] == 0 || |
| 393 | oup.ptr_host()[i] == static_cast<ctype>(scale)); |
| 394 | if (oup.ptr_host()[i] == 0) { |
| 395 | droped_cnt++; |
| 396 | } |
| 397 | } |
| 398 | float real_drop = droped_cnt * 1.0 / inp.layout().total_nr_elems(); |
| 399 | ASSERT_LT(abs(drop_prob - real_drop), 1e-2); |
| 400 | |
| 401 | #if CUDNN_VERSION >= 7000 |
| 402 | bwd->exec( |
| 403 | doup.tensornd_dev(), mask.tensornd_dev(), dinp.tensornd_dev(), |
| 404 | {bwd_ws.ptr_mutable_dev(), bwd_ws.layout().total_nr_elems()}); |
| 405 | for (size_t i = 0; i < inp.layout().total_nr_elems(); ++i) { |
| 406 | ASSERT_TRUE(oup.ptr_host()[i] == dinp.ptr_host()[i]); |
| 407 | } |
| 408 | #endif |
| 409 | }; |
nothing calls this directly
no test coverage detected