| 28 | } |
| 29 | |
| 30 | ChecksumForward::Result ChecksumForwardImpl::exec( |
| 31 | _megdnn_tensor_in data, _megdnn_workspace workspace) { |
| 32 | Result result; |
| 33 | memset(&result, 0, sizeof(result)); |
| 34 | check_exec(data.layout, workspace.size); |
| 35 | auto queue = cnrt_queue(handle()); |
| 36 | |
| 37 | auto ptr = static_cast<uint8_t*>(data.raw_ptr()); |
| 38 | size_t size_all = data.layout.shape[0], size_ints = size_all / sizeof(uint32_t); |
| 39 | auto last_val_size = std::min<size_t>(size_all, 4); |
| 40 | cnrt_check(cnrtMemcpyAsync( |
| 41 | &result.last_val, ptr + size_all - last_val_size, last_val_size, queue, |
| 42 | CNRT_MEM_TRANS_DIR_DEV2HOST)); |
| 43 | if (size_ints) { |
| 44 | auto&& device_info = current_device_info(); |
| 45 | bang_c_wrapper( |
| 46 | reinterpret_cast<uint32_t*>(workspace.raw_ptr), |
| 47 | static_cast<uint32_t*>(data.raw_ptr()), size_ints, queue, |
| 48 | device_info.ISAVersion); |
| 49 | cnrt_check(cnrtMemcpyAsync( |
| 50 | &result.checksum, workspace.raw_ptr, sizeof(result.checksum), queue, |
| 51 | CNRT_MEM_TRANS_DIR_DEV2HOST)); |
| 52 | } |
| 53 | cnrt_check(cnrtQueueSync(queue)); |
| 54 | return result; |
| 55 | } |
| 56 | |
| 57 | // vim: syntax=cpp.doxygen |
nothing calls this directly
no test coverage detected