===================== Image2DPack4TensorFormat ===================== */
| 598 | |
| 599 | /* ===================== Image2DPack4TensorFormat ===================== */ |
| 600 | TensorFormat Image2DPack4TensorFormat::make_raw( |
| 601 | size_t align_axis, size_t align_size_in_elements, |
| 602 | Handle::HandleVendorType vendor_type) { |
| 603 | static DNN_MUTEX mtx; |
| 604 | static std::unordered_map<uint64_t, std::unique_ptr<Image2DPack4TensorFormat>> |
| 605 | cache; |
| 606 | megdnn_assert( |
| 607 | std::max(align_axis, align_size_in_elements) <= |
| 608 | std::numeric_limits<uint32_t>::max()); |
| 609 | MEGDNN_LOCK_GUARD(mtx); |
| 610 | auto key = (static_cast<uint64_t>(align_axis) << 32) | |
| 611 | align_size_in_elements << 16 | (static_cast<size_t>(vendor_type)); |
| 612 | auto&& ptr = cache[key]; |
| 613 | if (!ptr) { |
| 614 | ptr.reset(new Image2DPack4TensorFormat{ |
| 615 | align_axis, align_size_in_elements, vendor_type}); |
| 616 | } |
| 617 | return impl_to_tensor_format(ptr.get()); |
| 618 | } |
| 619 | |
| 620 | TensorFormat Image2DPack4TensorFormat::make(size_t align_axis, const Handle* handle) { |
| 621 | return make_raw( |