#include <map>
#include <set>
#include <unordered_map>
+#include <shared_mutex>
#include <mutex>
#include <future>
#include <thread>
struct vk_device_struct {
std::recursive_mutex mutex;
+ mutable std::shared_mutex pinned_memory_mutex;
vk::PhysicalDevice physical_device;
vk::PhysicalDeviceProperties properties;
return nullptr;
}
- std::lock_guard<std::recursive_mutex> guard(device->mutex);
+ std::lock_guard<std::shared_mutex> guard(device->pinned_memory_mutex);
device->pinned_memory.push_back(std::make_tuple(buf->ptr, size, buf));
return buf->ptr;
return;
}
VK_LOG_MEMORY("ggml_vk_host_free(" << ptr << ")");
- std::lock_guard<std::recursive_mutex> guard(device->mutex);
+ std::lock_guard<std::shared_mutex> guard(device->pinned_memory_mutex);
vk_buffer buf;
size_t index;
}
static void ggml_vk_host_get(const vk_device& device, const void * ptr, vk_buffer& buf, size_t& buf_offset) {
- std::lock_guard<std::recursive_mutex> guard(device->mutex);
+ std::shared_lock<std::shared_mutex> guard(device->pinned_memory_mutex);
buf = nullptr;
buf_offset = 0;
for (size_t i = 0; i < device->pinned_memory.size(); i++) {