| 74 | } |
| 75 | |
| 76 | void MLIRCPUExecutable::execute(JITExecutor* fusion_opr) { |
| 77 | auto&& args = fusion_opr->args(); |
| 78 | std::vector<void*> args_array(args.inputs.size() + args.outputs.size()); |
| 79 | std::vector<void*> args_array_pointer(args.inputs.size() + args.outputs.size()); |
| 80 | size_t idx = 0; |
| 81 | for (size_t i = 0; i < args.inputs.size(); i++) { |
| 82 | args_array[idx] = tensor2memref( |
| 83 | {args.inputs[i].from->dev_tensor().raw_ptr(), args.inputs[i].layout}); |
| 84 | args_array_pointer[idx] = &args_array[idx]; |
| 85 | idx++; |
| 86 | } |
| 87 | int64_t nr_elements = 0; |
| 88 | for (size_t i = 0; i < args.outputs.size(); i++) { |
| 89 | if (nr_elements == 0) { |
| 90 | nr_elements = args.outputs[i].layout.total_nr_elems(); |
| 91 | } else { |
| 92 | mgb_assert( |
| 93 | static_cast<size_t>(nr_elements) == |
| 94 | args.outputs[i].layout.total_nr_elems(), |
| 95 | "The number of elements of outputs mismatch, expected: " |
| 96 | "%zu got: %zu(%s)", |
| 97 | static_cast<size_t>(nr_elements), |
| 98 | args.outputs[i].layout.total_nr_elems(), |
| 99 | args.outputs[i].layout.to_string().c_str()); |
| 100 | } |
| 101 | args_array[idx] = tensor2memref( |
| 102 | {args.outputs[i].from->dev_tensor().raw_ptr(), args.outputs[i].layout}); |
| 103 | args_array_pointer[idx] = &args_array[idx]; |
| 104 | idx++; |
| 105 | } |
| 106 | |
| 107 | args_array_pointer.push_back(&nr_elements); |
| 108 | std::string adapter_name = std::string("_mlir_ciface_") + m_kernel_name; |
| 109 | auto err = m_engine->invoke( |
| 110 | adapter_name, llvm::MutableArrayRef<void*>(args_array_pointer)); |
| 111 | if (err) { |
| 112 | mgb_throw( |
| 113 | InternalError, "failed to run MLIR kernel %s\n", m_kernel_name.c_str()); |
| 114 | } |
| 115 | |
| 116 | for (size_t i = 0; i < args_array.size(); i++) { |
| 117 | free(args_array[i]); |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | MLIRCPUExecutable::~MLIRCPUExecutable() {} |
| 122 | |