mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2026-06-17 11:07:39 +02:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e5ab32aab8 | |||
| 2f7732b667 | |||
| 9bee309a7c | |||
| 0412ec287c | |||
| 5b2d8236a7 |
+128
-82
@@ -65,9 +65,21 @@ struct ggml_kompute_context {
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: It would be good to consolidate the kompute manager and the kompute context into one object
|
||||
// and consolidate the init functions and simplify object lifetime management. As it currently stands,
|
||||
// we *have* to have the kompute manager no matter what for device discovery, but the kompute context
|
||||
// is only created when a device is set and vulkan is explicitly turned on.
|
||||
ggml_kompute_context *ggml_kompute_context::instance;
|
||||
|
||||
kp::Manager mgr;
|
||||
kp::Manager *komputeManager() {
|
||||
static kp::Manager *s_mgr = nullptr;
|
||||
if (s_mgr && !s_mgr->hasInstance()) {
|
||||
delete s_mgr;
|
||||
s_mgr = nullptr;
|
||||
}
|
||||
if (!s_mgr)
|
||||
s_mgr = new kp::Manager;
|
||||
return s_mgr;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
__attribute__((constructor))
|
||||
@@ -123,21 +135,21 @@ static std::string ggml_vk_getVendorName(uint32_t vendorID) {
|
||||
}
|
||||
|
||||
std::vector<ggml_vk_device> ggml_vk_available_devices(size_t memoryRequired) {
|
||||
std::vector<vk::PhysicalDevice> physicalDevices = mgr.listDevices();
|
||||
uint32_t deviceCount = physicalDevices.size();
|
||||
|
||||
std::vector<ggml_vk_device> results;
|
||||
if (!komputeManager()->hasVulkan())
|
||||
return results;
|
||||
|
||||
std::vector<vk::PhysicalDevice> physicalDevices = komputeManager()->listDevices();
|
||||
uint32_t deviceCount = physicalDevices.size();
|
||||
|
||||
if (deviceCount == 0)
|
||||
return results;
|
||||
|
||||
std::unordered_map<std::string, size_t> count_by_name;
|
||||
|
||||
for (uint32_t i = 0; i < deviceCount; i++) {
|
||||
VkPhysicalDeviceProperties properties;
|
||||
vkGetPhysicalDeviceProperties(physicalDevices.at(i), &properties);
|
||||
|
||||
VkPhysicalDeviceMemoryProperties memoryProperties;
|
||||
vkGetPhysicalDeviceMemoryProperties(physicalDevices.at(i), &memoryProperties);
|
||||
|
||||
VkPhysicalDeviceProperties properties = physicalDevices.at(i).getProperties();
|
||||
VkPhysicalDeviceMemoryProperties memoryProperties = physicalDevices.at(i).getMemoryProperties();
|
||||
const uint32_t major = VK_VERSION_MAJOR(properties.apiVersion);
|
||||
const uint32_t minor = VK_VERSION_MINOR(properties.apiVersion);
|
||||
if (major < 1 || minor < 2)
|
||||
@@ -163,6 +175,10 @@ std::vector<ggml_vk_device> ggml_vk_available_devices(size_t memoryRequired) {
|
||||
d.type = properties.deviceType;
|
||||
d.heapSize = heapSize;
|
||||
d.name = properties.deviceName;
|
||||
size_t n_idx = ++count_by_name[d.name];
|
||||
if (n_idx > 1) {
|
||||
d.name += " (" + std::to_string(n_idx) + ")";
|
||||
}
|
||||
d.vendor = ggml_vk_getVendorName(properties.vendorID);
|
||||
results.push_back(d);
|
||||
}
|
||||
@@ -229,22 +245,33 @@ bool ggml_vk_init_device(const ggml_vk_device &device) {
|
||||
}
|
||||
|
||||
bool ggml_vk_init_device(int device) {
|
||||
mgr.initializeDevice(device, {},
|
||||
komputeManager()->initializeDevice(device, {},
|
||||
{"VK_KHR_shader_float16_int8", "VK_KHR_8bit_storage",
|
||||
"VK_KHR_16bit_storage", "VK_KHR_storage_buffer_storage_class"});
|
||||
return ggml_vk_has_device();
|
||||
}
|
||||
|
||||
bool ggml_vk_free_device() {
|
||||
if (!ggml_vk_has_device())
|
||||
return false;
|
||||
komputeManager()->destroy();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ggml_vk_has_vulkan() {
|
||||
return komputeManager()->hasVulkan();
|
||||
}
|
||||
|
||||
bool ggml_vk_has_device() {
|
||||
return mgr.hasDevice();
|
||||
return komputeManager()->hasDevice();
|
||||
}
|
||||
|
||||
ggml_vk_device ggml_vk_current_device() {
|
||||
if (!mgr.hasDevice())
|
||||
if (!komputeManager()->hasDevice())
|
||||
return ggml_vk_device();
|
||||
|
||||
std::vector<ggml_vk_device> devices = ggml_vk_available_devices(0);
|
||||
ggml_vk_filterByName(devices, mgr.physicalDevice()->getProperties().deviceName);
|
||||
ggml_vk_filterByName(devices, komputeManager()->physicalDevice()->getProperties().deviceName);
|
||||
return devices.front();
|
||||
}
|
||||
|
||||
@@ -276,7 +303,7 @@ void ggml_vk_allocate_descriptor_pool(struct ggml_kompute_context * ctx, size_t
|
||||
descriptorPoolSizes.data());
|
||||
|
||||
ctx->pool = std::make_shared<vk::DescriptorPool>();
|
||||
vk::Result r = mgr.device()->createDescriptorPool(
|
||||
vk::Result r = komputeManager()->device()->createDescriptorPool(
|
||||
&descriptorPoolInfo, nullptr, ctx->pool.get());
|
||||
if (r != vk::Result::eSuccess)
|
||||
std::cerr << "Error allocating descriptor pool" << vk::to_string(r);
|
||||
@@ -285,7 +312,7 @@ void ggml_vk_allocate_descriptor_pool(struct ggml_kompute_context * ctx, size_t
|
||||
static
|
||||
void ggml_vk_free_descriptor_pool(struct ggml_kompute_context * ctx) {
|
||||
if (ctx->pool) {
|
||||
mgr.device()->destroy(
|
||||
komputeManager()->device()->destroy(
|
||||
*ctx->pool,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
ctx->pool = nullptr;
|
||||
@@ -302,9 +329,9 @@ vk::Buffer *ggml_vk_allocate_buffer(size_t size) {
|
||||
bufferCreateInfo.sharingMode = vk::SharingMode::eExclusive;
|
||||
|
||||
vk::Buffer *vkBuffer = new vk::Buffer;
|
||||
vk::Result r = mgr.device()->createBuffer(&bufferCreateInfo, nullptr, vkBuffer);
|
||||
vk::Result r = komputeManager()->device()->createBuffer(&bufferCreateInfo, nullptr, vkBuffer);
|
||||
if (r != vk::Result::eSuccess)
|
||||
std::cerr << "Error allocating buffer" << vk::to_string(r);
|
||||
std::cerr << "Error allocating buffer " << vk::to_string(r) << std::endl;
|
||||
return vkBuffer;
|
||||
}
|
||||
|
||||
@@ -313,7 +340,7 @@ vk::DeviceMemory *ggml_vk_allocate(size_t size, vk::MemoryPropertyFlags flags, v
|
||||
|
||||
uint32_t memoryTypeIndex = -1;
|
||||
bool memoryTypeIndexFound = false;
|
||||
vk::PhysicalDeviceMemoryProperties memoryProperties = mgr.physicalDevice()->getMemoryProperties();
|
||||
vk::PhysicalDeviceMemoryProperties memoryProperties = komputeManager()->physicalDevice()->getMemoryProperties();
|
||||
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {
|
||||
if (requirements.memoryTypeBits & (1 << i)) {
|
||||
if (((memoryProperties.memoryTypes[i]).propertyFlags &
|
||||
@@ -336,9 +363,11 @@ vk::DeviceMemory *ggml_vk_allocate(size_t size, vk::MemoryPropertyFlags flags, v
|
||||
allocInfo.allocationSize = size;
|
||||
allocInfo.memoryTypeIndex = memoryTypeIndex;
|
||||
vk::DeviceMemory *vkDeviceMemory = new vk::DeviceMemory;
|
||||
vk::Result r = mgr.device()->allocateMemory(&allocInfo, nullptr, vkDeviceMemory);
|
||||
if (r != vk::Result::eSuccess)
|
||||
std::cerr << "Error allocating memory" << vk::to_string(r);
|
||||
vk::Result r = komputeManager()->device()->allocateMemory(&allocInfo, nullptr, vkDeviceMemory);
|
||||
if (r != vk::Result::eSuccess) {
|
||||
std::cerr << "Error allocating memory " << vk::to_string(r) << std::endl;
|
||||
throw std::runtime_error("Error allocating vulkan memory.");
|
||||
}
|
||||
return vkDeviceMemory;
|
||||
}
|
||||
|
||||
@@ -347,7 +376,7 @@ size_t ggml_vk_aligned_offset(size_t offset) {
|
||||
static size_t minStorageBufferOffsetAlignment = 0;
|
||||
if (minStorageBufferOffsetAlignment == 0) {
|
||||
vk::PhysicalDeviceProperties deviceProperties;
|
||||
deviceProperties = mgr.physicalDevice()->getProperties();
|
||||
deviceProperties = komputeManager()->physicalDevice()->getProperties();
|
||||
vk::PhysicalDeviceLimits deviceLimits = deviceProperties.limits;
|
||||
minStorageBufferOffsetAlignment = deviceLimits.minStorageBufferOffsetAlignment;
|
||||
}
|
||||
@@ -363,12 +392,12 @@ size_t ggml_vk_aligned_offset(size_t offset) {
|
||||
|
||||
static void ggml_vk_h2d_buffer(const ggml_vk_memory &memory) {
|
||||
if (memory.stagingBuffer)
|
||||
mgr.sequence()->eval<kp::OpBufferSyncDevice>(memory.primaryBuffer, memory.stagingBuffer, memory.size);
|
||||
komputeManager()->sequence()->eval<kp::OpBufferSyncDevice>(memory.primaryBuffer, memory.stagingBuffer, memory.size);
|
||||
}
|
||||
|
||||
static void ggml_vk_d2h_buffer(const ggml_vk_memory &memory) {
|
||||
if (memory.stagingBuffer)
|
||||
mgr.sequence()->eval<kp::OpBufferSyncLocal>(memory.primaryBuffer, memory.stagingBuffer, memory.size);
|
||||
komputeManager()->sequence()->eval<kp::OpBufferSyncLocal>(memory.primaryBuffer, memory.stagingBuffer, memory.size);
|
||||
}
|
||||
|
||||
ggml_vk_memory ggml_vk_allocate(size_t size) {
|
||||
@@ -376,12 +405,12 @@ ggml_vk_memory ggml_vk_allocate(size_t size) {
|
||||
bool isHostVisible = false;
|
||||
{
|
||||
memory.primaryBuffer = ggml_vk_allocate_buffer(size);
|
||||
vk::MemoryRequirements memoryRequirements = mgr.device()->getBufferMemoryRequirements(*memory.primaryBuffer);
|
||||
vk::MemoryRequirements memoryRequirements = komputeManager()->device()->getBufferMemoryRequirements(*memory.primaryBuffer);
|
||||
vk::MemoryPropertyFlags memoryPropertyFlags = vk::MemoryPropertyFlagBits::eDeviceLocal;
|
||||
memory.primaryMemory = ggml_vk_allocate(size, memoryPropertyFlags, memoryRequirements, &isHostVisible);
|
||||
mgr.device()->bindBufferMemory(*memory.primaryBuffer, *memory.primaryMemory, 0);
|
||||
komputeManager()->device()->bindBufferMemory(*memory.primaryBuffer, *memory.primaryMemory, 0);
|
||||
if (isHostVisible) {
|
||||
vk::Result r = mgr.device()->mapMemory(*memory.primaryMemory, 0, size, vk::MemoryMapFlags(), &memory.data);
|
||||
vk::Result r = komputeManager()->device()->mapMemory(*memory.primaryMemory, 0, size, vk::MemoryMapFlags(), &memory.data);
|
||||
if (r != vk::Result::eSuccess)
|
||||
std::cerr << "Error mapping memory" << vk::to_string(r);
|
||||
}
|
||||
@@ -389,13 +418,13 @@ ggml_vk_memory ggml_vk_allocate(size_t size) {
|
||||
|
||||
if (!isHostVisible) {
|
||||
memory.stagingBuffer = ggml_vk_allocate_buffer(size);
|
||||
vk::MemoryRequirements memoryRequirements = mgr.device()->getBufferMemoryRequirements(*memory.stagingBuffer);
|
||||
vk::MemoryRequirements memoryRequirements = komputeManager()->device()->getBufferMemoryRequirements(*memory.stagingBuffer);
|
||||
vk::MemoryPropertyFlags memoryPropertyFlags = vk::MemoryPropertyFlagBits::eHostVisible |
|
||||
vk::MemoryPropertyFlagBits::eHostCoherent |
|
||||
vk::MemoryPropertyFlagBits::eHostCached;
|
||||
memory.stagingMemory = ggml_vk_allocate(size, memoryPropertyFlags, memoryRequirements, &isHostVisible);
|
||||
mgr.device()->bindBufferMemory(*memory.stagingBuffer, *memory.stagingMemory, 0);
|
||||
vk::Result r = mgr.device()->mapMemory(*memory.stagingMemory, 0, size, vk::MemoryMapFlags(), &memory.data);
|
||||
komputeManager()->device()->bindBufferMemory(*memory.stagingBuffer, *memory.stagingMemory, 0);
|
||||
vk::Result r = komputeManager()->device()->mapMemory(*memory.stagingMemory, 0, size, vk::MemoryMapFlags(), &memory.data);
|
||||
if (r != vk::Result::eSuccess)
|
||||
std::cerr << "Error mapping memory" << vk::to_string(r);
|
||||
}
|
||||
@@ -406,19 +435,19 @@ ggml_vk_memory ggml_vk_allocate(size_t size) {
|
||||
|
||||
void ggml_vk_free_memory(ggml_vk_memory &memory)
|
||||
{
|
||||
mgr.device()->destroy(
|
||||
komputeManager()->device()->destroy(
|
||||
*memory.primaryBuffer,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
if (memory.stagingBuffer) {
|
||||
mgr.device()->destroy(
|
||||
komputeManager()->device()->destroy(
|
||||
*memory.stagingBuffer,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
}
|
||||
mgr.device()->freeMemory(
|
||||
komputeManager()->device()->freeMemory(
|
||||
*memory.primaryMemory,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
if (memory.stagingMemory) {
|
||||
mgr.device()->freeMemory(
|
||||
komputeManager()->device()->freeMemory(
|
||||
*memory.stagingMemory,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
}
|
||||
@@ -458,7 +487,7 @@ const std::shared_ptr<kp::Tensor> ggml_vk_get_tensor(struct ggml_kompute_context
|
||||
nbytes += *alignedOffset;
|
||||
}
|
||||
|
||||
return mgr.tensor(
|
||||
return komputeManager()->tensor(
|
||||
t->data,
|
||||
nelements,
|
||||
nbytes, kp::Tensor::TensorDataTypes::eFloat,
|
||||
@@ -477,7 +506,7 @@ void ggml_vk_add_buffer(
|
||||
void ggml_vk_h2d_tensor(struct ggml_kompute_context * ctx, struct ggml_tensor * t) {
|
||||
const auto res = ggml_vk_get_tensor(ctx, t, nullptr);
|
||||
GGML_ASSERT(res);
|
||||
mgr.sequence()->eval<kp::OpTensorSyncDevice>({res});
|
||||
komputeManager()->sequence()->eval<kp::OpTensorSyncDevice>({res});
|
||||
}
|
||||
|
||||
void ggml_vk_h2d_all(struct ggml_kompute_context * ctx) {
|
||||
@@ -497,7 +526,7 @@ void ggml_vk_d2h_tensor(struct ggml_kompute_context * ctx, struct ggml_tensor *
|
||||
const auto res = ggml_vk_get_tensor(ctx, t, nullptr);
|
||||
|
||||
GGML_ASSERT(res);
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({res});
|
||||
komputeManager()->sequence()->eval<kp::OpTensorSyncLocal>({res});
|
||||
}
|
||||
|
||||
std::vector<uint32_t> getSpirvShader(const unsigned char* rawData, size_t size) {
|
||||
@@ -538,10 +567,11 @@ void ggml_vk_add(kp::Sequence& seq,
|
||||
safe_divide(inAOff, 4), safe_divide(inBOff, 4), safe_divide(outOff, 4)
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -568,10 +598,11 @@ void ggml_vk_addrow(kp::Sequence& seq,
|
||||
row
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -596,10 +627,11 @@ void ggml_vk_mul(kp::Sequence& seq,
|
||||
safe_divide(inAOff, 4), safe_divide(inBOff, 4), safe_divide(outOff, 4)
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -626,10 +658,11 @@ void ggml_vk_mulrow(kp::Sequence& seq,
|
||||
row
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -654,10 +687,11 @@ void ggml_vk_scale(kp::Sequence& seq,
|
||||
scale
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -677,10 +711,11 @@ void ggml_vk_xxlu(const std::vector<uint32_t>& spirv, kp::Sequence& seq,
|
||||
safe_divide(inOff, 4), safe_divide(outOff, 4),
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -730,10 +765,11 @@ void ggml_vk_soft_max(kp::Sequence& seq,
|
||||
ne00, ne01, ne02
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne01), unsigned(ne02), unsigned(ne03)}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne01), unsigned(ne02), unsigned(ne03)}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({unsigned(ne01), unsigned(ne02), unsigned(ne03)});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -762,10 +798,11 @@ void ggml_vk_norm_(const std::vector<uint32_t>& spirv, kp::Sequence& seq,
|
||||
(uint32_t)ne00, (uint32_t)nb01, epsilon
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {(uint32_t)nrows}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {(uint32_t)nrows}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({(uint32_t)nrows});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -809,10 +846,11 @@ void ggml_vk_diag_mask_inf(kp::Sequence& seq,
|
||||
ne00, ne01
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne00), unsigned(ne01), unsigned(ne02)}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne00), unsigned(ne01), unsigned(ne02)}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({unsigned(ne00), unsigned(ne01), unsigned(ne02)});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -845,10 +883,11 @@ void ggml_vk_mul_mat_f16(kp::Sequence& seq,
|
||||
ne00, nb01, nb02, nb11, nb12, ne0, ne1,
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {unsigned(ne01), unsigned(ne11), unsigned(ne12)}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {unsigned(ne01), unsigned(ne11), unsigned(ne12)}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({unsigned(ne01), unsigned(ne11), unsigned(ne12)});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -872,10 +911,11 @@ void ggml_vk_mul_mat_q4_x(const std::vector<uint32_t>& spirv, uint32_t block_siz
|
||||
ne00, ne10, ne0,
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {unsigned(ne01), unsigned(ne11)}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {unsigned(ne01), unsigned(ne11)}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({unsigned(ne01), unsigned(ne11)});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -922,10 +962,11 @@ void ggml_vk_get_rows(const std::vector<uint32_t>& spirv,
|
||||
ne00, nb01, nb1
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {inA, inB, out}, spirv, {size}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({inA, inB, out});
|
||||
s_algo->setWorkgroup({size});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -997,10 +1038,11 @@ void ggml_vk_rope(kp::Sequence& seq,
|
||||
nb0, nb1, nb2, nb3
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne01), unsigned(ne02), unsigned(ne03)}, {}, {pushConsts});
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(__func__))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(__func__, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne01), unsigned(ne02), unsigned(ne03)}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(__func__);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({unsigned(ne01), unsigned(ne02), unsigned(ne03)});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -1033,10 +1075,14 @@ void ggml_vk_cpy(const std::vector<uint32_t>& spirv,
|
||||
nb0, nb1, nb2, nb3
|
||||
};
|
||||
|
||||
static std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!s_algo)
|
||||
s_algo = mgr.algorithm<float, PushConstants>(ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne01), unsigned(ne02), unsigned(ne03)}, {}, {pushConsts});
|
||||
static std::string unique_name = std::string(__func__) +
|
||||
"_i_" + std::to_string(in_element_size) +
|
||||
"_o_" + std::to_string(out_element_size);
|
||||
std::shared_ptr<kp::Algorithm> s_algo = nullptr;
|
||||
if (!komputeManager()->hasAlgorithm(unique_name))
|
||||
s_algo = komputeManager()->algorithm<float, PushConstants>(unique_name, ggml_kompute_context::instance->pool.get(), {in, out}, spirv, {unsigned(ne01), unsigned(ne02), unsigned(ne03)}, {}, {pushConsts});
|
||||
else {
|
||||
s_algo = komputeManager()->getAlgorithm(unique_name);
|
||||
s_algo->setTensors({in, out});
|
||||
s_algo->setWorkgroup({unsigned(ne01), unsigned(ne02), unsigned(ne03)});
|
||||
s_algo->setPushConstants<PushConstants>({pushConsts});
|
||||
@@ -1083,7 +1129,7 @@ void ggml_vk_graph_compute(struct ggml_kompute_context * ctx, struct ggml_cgraph
|
||||
std::vector<std::shared_ptr<kp::Sequence>> sequences(n_seq);
|
||||
|
||||
for (auto& sequence : sequences) {
|
||||
sequence = mgr.sequence();
|
||||
sequence = komputeManager()->sequence();
|
||||
}
|
||||
for (int seq_idx = 0; seq_idx < n_seq; ++seq_idx) {
|
||||
const int n_nodes_per_seq = (gf->n_nodes + n_seq - 1) / n_seq;
|
||||
|
||||
@@ -40,6 +40,8 @@ std::vector<ggml_vk_device> ggml_vk_available_devices(size_t memoryRequired);
|
||||
bool ggml_vk_init_device(size_t memoryRequired, const std::string &device);
|
||||
bool ggml_vk_init_device(const ggml_vk_device &device);
|
||||
bool ggml_vk_init_device(int device);
|
||||
bool ggml_vk_free_device();
|
||||
bool ggml_vk_has_vulkan();
|
||||
bool ggml_vk_has_device();
|
||||
ggml_vk_device ggml_vk_current_device();
|
||||
struct ggml_kompute_context * ggml_vk_init(void);
|
||||
|
||||
@@ -158,6 +158,8 @@ else()
|
||||
find_package(fmt REQUIRED)
|
||||
endif()
|
||||
|
||||
add_compile_definitions(VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)
|
||||
|
||||
# ####################################################
|
||||
# Preprocessor Macros
|
||||
# ####################################################
|
||||
|
||||
@@ -58,18 +58,6 @@ Algorithm::destroy()
|
||||
this->mPipeline = nullptr;
|
||||
}
|
||||
|
||||
if (this->mFreePipelineCache && this->mPipelineCache) {
|
||||
KP_LOG_DEBUG("Kompute Algorithm Destroying pipeline cache");
|
||||
if (!this->mPipelineCache) {
|
||||
KP_LOG_WARN("Kompute Algorithm Error requested to destroy "
|
||||
"pipeline cache but it is null");
|
||||
}
|
||||
this->mDevice->destroy(
|
||||
*this->mPipelineCache,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
this->mPipelineCache = nullptr;
|
||||
}
|
||||
|
||||
if (this->mFreePipelineLayout && this->mPipelineLayout) {
|
||||
KP_LOG_DEBUG("Kompute Algorithm Destroying pipeline layout");
|
||||
if (!this->mPipelineLayout) {
|
||||
@@ -317,16 +305,6 @@ Algorithm::createPipeline()
|
||||
"main",
|
||||
&specializationInfo);
|
||||
|
||||
static std::shared_ptr<vk::PipelineCache> globalPipelineCache = std::make_shared<vk::PipelineCache>();
|
||||
if(!*globalPipelineCache) {
|
||||
vk::PipelineCacheCreateInfo pipelineCacheInfo =
|
||||
vk::PipelineCacheCreateInfo();
|
||||
this->mPipelineCache = globalPipelineCache;
|
||||
this->mFreePipelineCache = true;
|
||||
this->mDevice->createPipelineCache(
|
||||
&pipelineCacheInfo, nullptr, globalPipelineCache.get());
|
||||
}
|
||||
|
||||
vk::ComputePipelineCreateInfo pipelineInfo(vk::PipelineCreateFlags(),
|
||||
shaderStage,
|
||||
*this->mPipelineLayout,
|
||||
@@ -335,7 +313,7 @@ Algorithm::createPipeline()
|
||||
|
||||
#ifdef KOMPUTE_CREATE_PIPELINE_RESULT_VALUE
|
||||
vk::ResultValue<vk::Pipeline> pipelineResult =
|
||||
this->mDevice->createComputePipeline(*globalPipelineCache, pipelineInfo);
|
||||
this->mDevice->createComputePipeline(*mPipelineCache, pipelineInfo);
|
||||
|
||||
if (pipelineResult.result != vk::Result::eSuccess) {
|
||||
throw std::runtime_error("Failed to create pipeline result: " +
|
||||
@@ -347,7 +325,7 @@ Algorithm::createPipeline()
|
||||
this->mFreePipeline = true;
|
||||
#else
|
||||
vk::Pipeline pipeline =
|
||||
this->mDevice->createComputePipeline(*globalPipelineCache, pipelineInfo)
|
||||
this->mDevice->createComputePipeline(*mPipelineCache, pipelineInfo)
|
||||
.value;
|
||||
this->mPipeline = std::make_shared<vk::Pipeline>(pipeline);
|
||||
this->mFreePipeline = true;
|
||||
|
||||
@@ -59,7 +59,7 @@ if(KOMPUTE_OPT_ANDROID_BUILD)
|
||||
kp_shader
|
||||
fmt::fmt-header-only)
|
||||
else()
|
||||
target_link_libraries(kompute PUBLIC Vulkan::Vulkan
|
||||
target_link_libraries(kompute PUBLIC
|
||||
kp_logger
|
||||
kp_shader
|
||||
fmt::fmt-header-only)
|
||||
@@ -73,6 +73,8 @@ endif()
|
||||
|
||||
if(KOMPUTE_OPT_USE_BUILT_IN_VULKAN_HEADER)
|
||||
target_link_libraries(kompute PUBLIC Vulkan-Headers)
|
||||
else()
|
||||
target_link_libraries(kompute PUBLIC Vulkan::Headers)
|
||||
endif()
|
||||
|
||||
# ####################################################
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
#include "kompute/Core.hpp"
|
||||
|
||||
#if VK_USE_PLATFORM_ANDROID_KHR
|
||||
#ifndef KOMPUTE_VK_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
||||
#define KOMPUTE_VK_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
||||
/**
|
||||
@@ -21,7 +20,6 @@
|
||||
**/
|
||||
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
||||
#endif // !KOMPUTE_VK_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
||||
#endif // VK_USE_PLATFORM_ANDROID_KHR
|
||||
|
||||
namespace kp {
|
||||
} // namespace kp
|
||||
|
||||
+37
-17
@@ -88,15 +88,14 @@ Manager::destroy()
|
||||
this->mManagedSequences.clear();
|
||||
}
|
||||
|
||||
if (this->mManageResources && this->mManagedAlgorithms.size()) {
|
||||
if (this->mManageResources && !this->mManagedAlgorithmsMap.empty()) {
|
||||
KP_LOG_DEBUG("Kompute Manager explicitly freeing algorithms");
|
||||
for (const std::weak_ptr<Algorithm>& weakAlgorithm :
|
||||
this->mManagedAlgorithms) {
|
||||
if (std::shared_ptr<Algorithm> algorithm = weakAlgorithm.lock()) {
|
||||
for (const auto& kv : this->mManagedAlgorithmsMap) {
|
||||
if (std::shared_ptr<Algorithm> algorithm = kv.second) {
|
||||
algorithm->destroy();
|
||||
}
|
||||
}
|
||||
this->mManagedAlgorithms.clear();
|
||||
this->mManagedAlgorithmsMap.clear();
|
||||
}
|
||||
|
||||
if (this->mManageResources && this->mManagedTensors.size()) {
|
||||
@@ -109,6 +108,18 @@ Manager::destroy()
|
||||
this->mManagedTensors.clear();
|
||||
}
|
||||
|
||||
if (this->mPipelineCache) {
|
||||
KP_LOG_DEBUG("Kompute Manager Destroying pipeline cache");
|
||||
if (!this->mPipelineCache) {
|
||||
KP_LOG_WARN("Kompute Manager Error requested to destroy "
|
||||
"pipeline cache but it is null");
|
||||
}
|
||||
this->mDevice->destroy(
|
||||
*this->mPipelineCache,
|
||||
(vk::Optional<const vk::AllocationCallbacks>)nullptr);
|
||||
this->mPipelineCache = nullptr;
|
||||
}
|
||||
|
||||
if (this->mFreeDevice) {
|
||||
KP_LOG_INFO("Destroying device");
|
||||
this->mDevice->destroy(
|
||||
@@ -223,20 +234,21 @@ Manager::createInstance()
|
||||
}
|
||||
#endif
|
||||
|
||||
#if VK_USE_PLATFORM_ANDROID_KHR
|
||||
vk::DynamicLoader dl;
|
||||
try {
|
||||
mDynamicLoader = std::make_shared<vk::DynamicLoader>();
|
||||
} catch (const std::exception & err) {
|
||||
return;
|
||||
}
|
||||
|
||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr =
|
||||
dl.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
|
||||
mDynamicLoader->getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
|
||||
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);
|
||||
#endif // VK_USE_PLATFORM_ANDROID_KHR
|
||||
|
||||
this->mInstance = std::make_shared<vk::Instance>();
|
||||
vk::createInstance(
|
||||
&computeInstanceCreateInfo, nullptr, this->mInstance.get());
|
||||
|
||||
#if VK_USE_PLATFORM_ANDROID_KHR
|
||||
VULKAN_HPP_DEFAULT_DISPATCHER.init(*this->mInstance);
|
||||
#endif // VK_USE_PLATFORM_ANDROID_KHR
|
||||
|
||||
KP_LOG_DEBUG("Kompute Manager Instance Created");
|
||||
|
||||
@@ -268,12 +280,14 @@ Manager::clear()
|
||||
end(this->mManagedTensors),
|
||||
[](std::weak_ptr<Tensor> t) { return t.expired(); }),
|
||||
end(this->mManagedTensors));
|
||||
this->mManagedAlgorithms.erase(
|
||||
std::remove_if(
|
||||
begin(this->mManagedAlgorithms),
|
||||
end(this->mManagedAlgorithms),
|
||||
[](std::weak_ptr<Algorithm> t) { return t.expired(); }),
|
||||
end(this->mManagedAlgorithms));
|
||||
for (auto it = this->mManagedAlgorithmsMap.begin();
|
||||
it != this->mManagedAlgorithmsMap.end();) {
|
||||
if (it->second) {
|
||||
it = this->mManagedAlgorithmsMap.erase(it);
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
this->mManagedSequences.erase(
|
||||
std::remove_if(begin(this->mManagedSequences),
|
||||
end(this->mManagedSequences),
|
||||
@@ -451,6 +465,12 @@ Manager::createDevice(const std::vector<uint32_t>& familyQueueIndices,
|
||||
}
|
||||
|
||||
KP_LOG_DEBUG("Kompute Manager compute queue obtained");
|
||||
|
||||
mPipelineCache = std::make_shared<vk::PipelineCache>();
|
||||
vk::PipelineCacheCreateInfo pipelineCacheInfo =
|
||||
vk::PipelineCacheCreateInfo();
|
||||
this->mDevice->createPipelineCache(
|
||||
&pipelineCacheInfo, nullptr, mPipelineCache.get());
|
||||
}
|
||||
|
||||
std::shared_ptr<Sequence>
|
||||
|
||||
@@ -45,6 +45,7 @@ class Algorithm
|
||||
*/
|
||||
template<typename S = float, typename P = float>
|
||||
Algorithm(std::shared_ptr<vk::Device> device,
|
||||
vk::PipelineCache *pipelineCache,
|
||||
vk::DescriptorPool *pool,
|
||||
const std::vector<std::shared_ptr<Tensor>>& tensors = {},
|
||||
const std::vector<uint32_t>& spirv = {},
|
||||
@@ -55,6 +56,7 @@ class Algorithm
|
||||
KP_LOG_DEBUG("Kompute Algorithm Constructor with device");
|
||||
|
||||
this->mDevice = device;
|
||||
this->mPipelineCache = pipelineCache;
|
||||
this->mDescriptorPool = pool;
|
||||
|
||||
if (tensors.size() && spirv.size()) {
|
||||
@@ -310,8 +312,7 @@ class Algorithm
|
||||
bool mFreeShaderModule = false;
|
||||
std::shared_ptr<vk::PipelineLayout> mPipelineLayout;
|
||||
bool mFreePipelineLayout = false;
|
||||
std::shared_ptr<vk::PipelineCache> mPipelineCache;
|
||||
bool mFreePipelineCache = false;
|
||||
vk::PipelineCache *mPipelineCache = nullptr;
|
||||
std::shared_ptr<vk::Pipeline> mPipeline;
|
||||
bool mFreePipeline = false;
|
||||
|
||||
|
||||
@@ -39,10 +39,18 @@ class Manager
|
||||
*/
|
||||
~Manager();
|
||||
|
||||
bool hasInstance() const {
|
||||
return this->mInstance.get();
|
||||
}
|
||||
|
||||
bool hasDevice() const {
|
||||
return this->mDevice.get();
|
||||
}
|
||||
|
||||
bool hasVulkan() const {
|
||||
return this->mDynamicLoader.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a device.
|
||||
*
|
||||
@@ -145,6 +153,7 @@ class Manager
|
||||
* @returns Shared pointer with initialised algorithm
|
||||
*/
|
||||
std::shared_ptr<Algorithm> algorithm(
|
||||
const std::string &name,
|
||||
vk::DescriptorPool *pool,
|
||||
const std::vector<std::shared_ptr<Tensor>>& tensors = {},
|
||||
const std::vector<uint32_t>& spirv = {},
|
||||
@@ -153,7 +162,7 @@ class Manager
|
||||
const std::vector<float>& pushConstants = {})
|
||||
{
|
||||
return this->algorithm<>(
|
||||
pool, tensors, spirv, workgroup, specializationConstants, pushConstants);
|
||||
name, pool, tensors, spirv, workgroup, specializationConstants, pushConstants);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,6 +181,7 @@ class Manager
|
||||
*/
|
||||
template<typename S = float, typename P = float>
|
||||
std::shared_ptr<Algorithm> algorithm(
|
||||
const std::string &name,
|
||||
vk::DescriptorPool *pool,
|
||||
const std::vector<std::shared_ptr<Tensor>>& tensors,
|
||||
const std::vector<uint32_t>& spirv,
|
||||
@@ -184,6 +194,7 @@ class Manager
|
||||
|
||||
std::shared_ptr<Algorithm> algorithm{ new kp::Algorithm(
|
||||
this->mDevice,
|
||||
mPipelineCache.get(),
|
||||
pool,
|
||||
tensors,
|
||||
spirv,
|
||||
@@ -192,12 +203,24 @@ class Manager
|
||||
pushConstants) };
|
||||
|
||||
if (this->mManageResources) {
|
||||
this->mManagedAlgorithms.push_back(algorithm);
|
||||
this->mManagedAlgorithmsMap.insert({name, algorithm});
|
||||
}
|
||||
|
||||
return algorithm;
|
||||
}
|
||||
|
||||
bool hasAlgorithm(const std::string &name) const {
|
||||
return mManagedAlgorithmsMap.find(name) != mManagedAlgorithmsMap.end();
|
||||
}
|
||||
|
||||
std::shared_ptr<Algorithm> getAlgorithm(const std::string &name) const {
|
||||
auto it = mManagedAlgorithmsMap.find(name);
|
||||
if (it != mManagedAlgorithmsMap.end()) {
|
||||
return it->second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy the GPU resources and all managed resources by manager.
|
||||
**/
|
||||
@@ -233,6 +256,7 @@ class Manager
|
||||
|
||||
std::shared_ptr<vk::Device> device() const { return mDevice; }
|
||||
std::shared_ptr<vk::PhysicalDevice> physicalDevice() const { return mPhysicalDevice; }
|
||||
std::shared_ptr<vk::PipelineCache> pipelineCache() const { return mPipelineCache; }
|
||||
|
||||
private:
|
||||
// -------------- OPTIONALLY OWNED RESOURCES
|
||||
@@ -240,15 +264,17 @@ class Manager
|
||||
bool mFreeInstance = false;
|
||||
std::shared_ptr<vk::PhysicalDevice> mPhysicalDevice = nullptr;
|
||||
std::shared_ptr<vk::Device> mDevice = nullptr;
|
||||
std::shared_ptr<vk::DynamicLoader> mDynamicLoader = nullptr;
|
||||
bool mFreeDevice = false;
|
||||
|
||||
// -------------- ALWAYS OWNED RESOURCES
|
||||
std::vector<std::weak_ptr<Tensor>> mManagedTensors;
|
||||
std::vector<std::weak_ptr<Sequence>> mManagedSequences;
|
||||
std::vector<std::weak_ptr<Algorithm>> mManagedAlgorithms;
|
||||
std::unordered_map<std::string, std::shared_ptr<Algorithm>> mManagedAlgorithmsMap;
|
||||
|
||||
std::vector<uint32_t> mComputeQueueFamilyIndices;
|
||||
std::vector<std::shared_ptr<vk::Queue>> mComputeQueues;
|
||||
std::shared_ptr<vk::PipelineCache> mPipelineCache;
|
||||
|
||||
bool mManageResources = false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user