5#include <Metal/Metal.hpp>
10#include <shared_mutex>
12#include <unordered_map>
13#include <unordered_set>
18namespace fs = std::filesystem;
26 std::string mtllib_path;
27 std::string lib_ext = lib_name +
".metallib";
31 auto mtllib = fs::path(info.dli_fname).remove_filename() / lib_ext;
32 mtllib_path = mtllib.c_str();
39 std::vector<std::tuple<const void*, MTL::DataType, NS::UInteger>>;
48 enc.concurrent_ =
true;
51 enc.concurrent_ =
false;
53 enc.concurrent_outputs_.begin(), enc.concurrent_outputs_.end());
54 enc.concurrent_outputs_.clear();
76 std::unordered_set<const void*>&
inputs() {
81 std::unordered_set<const void*>
outputs() {
86 MTL::ComputeCommandEncoder* enc_;
87 bool concurrent_{
false};
88 std::unordered_set<MTL::Resource*> outputs_;
89 std::unordered_set<MTL::Resource*> concurrent_outputs_;
90 std::unordered_set<const void*> all_inputs_;
91 std::unordered_set<const void*> all_outputs_;
112 std::unordered_map<const void*, std::shared_ptr<Fence>>
outputs;
123 std::unique_ptr<CommandEncoder>
encoder{
nullptr};
152 const std::string& lib_name,
153 const std::string& lib_path);
158 if (
auto it = library_map_.find(lib_name); it == library_map_.end()) {
164 const std::string& name,
165 const std::function<std::string(
void)>& builder);
168 const std::string& base_name,
169 MTL::Library* mtl_lib,
170 const std::string& hash_name =
"",
172 const std::vector<MTL::Function*>& linked_functions = {});
175 const std::string& base_name,
176 const std::string& lib_name =
"mlx",
177 const std::string& hash_name =
"",
179 const std::vector<MTL::Function*>& linked_functions = {});
182 const std::vector<MTL::ArgumentDescriptor*>& arg_descs)
const;
192 return stream_map_.find(index)->second;
194 MTL::Library* get_library_cache_(
const std::string& name);
196 MTL::Library* get_library_(
const std::string& name);
197 MTL::Library* build_library_(
const std::string& source_string);
199 MTL::Function* get_function_(
const std::string& name, MTL::Library* mtl_lib);
201 MTL::Function* get_function_(
202 const std::string& name,
203 const std::string& specialized_name,
205 MTL::Library* mtl_lib);
207 MTL::LinkedFunctions* get_linked_functions_(
208 const std::vector<MTL::Function*>& funcs);
210 MTL::ComputePipelineState* get_kernel_(
211 const std::string& name,
212 const MTL::Function* mtl_function);
214 MTL::ComputePipelineState* get_kernel_(
215 const std::string& name,
216 const MTL::Function* mtl_function,
217 const MTL::LinkedFunctions* linked_functions);
219 MTL::ComputePipelineState* get_kernel_(
220 const std::string& base_name,
221 MTL::Library* mtl_lib,
222 const std::string& hash_name,
224 const std::vector<MTL::Function*>& linked_functions = {});
226 MTL::Device* device_;
227 std::unordered_map<int32_t, DeviceStream> stream_map_;
229 std::shared_mutex kernel_mtx_;
230 std::unordered_map<std::string, MTL::ComputePipelineState*> kernel_map_;
232 std::shared_mutex library_mtx_;
233 std::unordered_map<std::string, MTL::Library*> library_map_;
234 const MTL::ResidencySet* residency_set_{
nullptr};
~ConcurrentContext()
Definition device.h:50
ConcurrentContext(CommandEncoder &enc)
Definition device.h:47