| 41 | } |
| 42 | |
| 43 | void SoftmaxForwardImpl::exec( |
| 44 | _megdnn_tensor_in src, _megdnn_tensor_out dst, _megdnn_workspace workspace) { |
| 45 | #if !MGE_BUILD_WITHOUT_NAIVE_EXEC |
| 46 | check_exec(src.layout, dst.layout, workspace.size); |
| 47 | |
| 48 | WorkspaceBundle workspace_bundle{ |
| 49 | workspace.raw_ptr, {src.layout.span().dist_byte(), reduce_worksize}}; |
| 50 | |
| 51 | TensorLayout tmp_layout; |
| 52 | reduce_opr->param().mode = Reduce::Mode::MAX; |
| 53 | reduce_opr->deduce_layout(src.layout, tmp_layout); |
| 54 | TensorND max_tensor{workspace_bundle.get_workspace(0).raw_ptr, tmp_layout}; |
| 55 | reduce_opr->exec(src, max_tensor, workspace_bundle.get_workspace(1)); |
| 56 | |
| 57 | elemwise_opr->param().mode = Elemwise::Mode::SUB; |
| 58 | elemwise_opr->exec({src, max_tensor}, dst); |
| 59 | |
| 60 | // no broadcast |
| 61 | elemwise_opr->param().mode = Elemwise::Mode::EXP; |
| 62 | elemwise_opr->exec({dst}, dst); |
| 63 | |
| 64 | reduce_opr->param().mode = Reduce::Mode::SUM; |
| 65 | reduce_opr->deduce_layout(src.layout, tmp_layout); |
| 66 | |
| 67 | TensorND deno_tensor{workspace_bundle.get_workspace(0).raw_ptr, tmp_layout}; |
| 68 | reduce_opr->exec(dst, deno_tensor, workspace_bundle.get_workspace(1)); |
| 69 | |
| 70 | elemwise_opr->param().mode = Elemwise::Mode::TRUE_DIV; |
| 71 | elemwise_opr->exec({dst, deno_tensor}, dst); |
| 72 | #else |
| 73 | __builtin_trap(); |
| 74 | #endif |
| 75 | } |
| 76 | |
| 77 | //=============================Softmax backward ============================ |
| 78 |
nothing calls this directly
no test coverage detected