| 723 | /* =================== misc =================== */ |
| 724 | |
| 725 | void mgb::dev_tensor_memset(const DeviceTensorND& tensor, int val) { |
| 726 | auto&& env = CompNodeEnv::from_comp_node(tensor.comp_node()); |
| 727 | env.activate(); |
| 728 | size_t size = tensor.layout().span().dist_byte(); |
| 729 | switch (env.property().type) { |
| 730 | #if MGB_CUDA |
| 731 | case CompNode::DeviceType::CUDA: |
| 732 | MGB_CUDA_CHECK(cudaMemsetAsync( |
| 733 | tensor.raw_ptr(), val, size, env.cuda_env().stream)); |
| 734 | break; |
| 735 | #endif |
| 736 | #if MGB_ATLAS |
| 737 | case CompNode::DeviceType::ATLAS: |
| 738 | #if MGB_USE_ATLAS_ASYNC_API |
| 739 | MGB_ATLAS_CHECK(aclrtMemsetAsync( |
| 740 | tensor.raw_ptr(), -1, val, size, env.atlas_env().stream)); |
| 741 | #else |
| 742 | MGB_ATLAS_CHECK(aclrtMemset(tensor.raw_ptr(), -1, val, size)); |
| 743 | #endif |
| 744 | break; |
| 745 | #endif |
| 746 | #if MGB_CAMBRICON |
| 747 | case CompNode::DeviceType::CAMBRICON: |
| 748 | MGB_CNRT_CHECK( |
| 749 | cnrtMemsetAsync(tensor.raw_ptr(), val, size, env.cnrt_env().queue)); |
| 750 | break; |
| 751 | #endif |
| 752 | case CompNode::DeviceType::CPU: { |
| 753 | auto fill = [tensor, size, val]() { |
| 754 | std::memset(tensor.as_megdnn().raw_ptr(), val, size); |
| 755 | }; |
| 756 | env.cpu_env().dispatch(fill); |
| 757 | } break; |
| 758 | default: |
| 759 | mgb_throw( |
| 760 | MegBrainError, "unhandled comp node in dev_tensor_memset: %s", |
| 761 | tensor.comp_node().to_string().c_str()); |
| 762 | } |
| 763 | } |
| 764 | |
| 765 | namespace mgb { |
| 766 | template class TensorStorage<HostTensorStorageTrait>; |