Skip to content

Commit 74ba851

Browse files
wishlee1124flynnjiang
authored andcommitted
ggml/kompute: Move butf into struct ggml_backend_kompute_context
Signed-off-by: Weishi Li <liweishi@kylinos.cn>
1 parent e914ac7 commit 74ba851

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

ggml/src/ggml-kompute.cpp

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ struct ggml_backend_kompute_context {
7171
std::string name;
7272
std::shared_ptr<vk::DescriptorPool> pool;
7373

74+
ggml_backend_buffer_type buft;
75+
7476
ggml_backend_kompute_context(int device)
75-
: device(device), name(ggml_kompute_format_name(device)) {}
77+
: device(device), name(ggml_kompute_format_name(device)) { buft.context = nullptr; }
7678
};
7779

7880
// FIXME: It would be good to consolidate the kompute manager and the kompute context into one object
@@ -1918,24 +1920,25 @@ static ggml_backend_buffer_type_i ggml_backend_kompute_buffer_type_interface = {
19181920
};
19191921

19201922
ggml_backend_buffer_type_t ggml_backend_kompute_buffer_type(int device) {
1921-
static std::vector<ggml_backend_buffer_type> bufts = []() {
1922-
std::vector<ggml_backend_buffer_type> vec;
1923-
auto devices = ggml_vk_available_devices_internal(0);
1924-
vec.reserve(devices.size());
1923+
if (!s_kompute_context)
1924+
s_kompute_context = new ggml_backend_kompute_context(device);
19251925

1926-
for (const auto & dev : devices) {
1927-
vec.push_back({
1928-
/* .iface = */ ggml_backend_kompute_buffer_type_interface,
1929-
/* .context = */ new ggml_backend_kompute_buffer_type_context(dev.index, dev.bufferAlignment, dev.maxAlloc)
1930-
});
1926+
auto * buft = &s_kompute_context->buft;
1927+
if (!buft->context) {
1928+
auto devices = ggml_vk_available_devices_internal(0);
1929+
for (std::size_t i = 0; i < devices.size(); i++) {
1930+
if (device == devices[i].index) {
1931+
buft->context = new ggml_backend_kompute_buffer_type_context(
1932+
devices[i].index,
1933+
devices[i].bufferAlignment,
1934+
devices[i].maxAlloc);
1935+
buft->iface = ggml_backend_kompute_buffer_type_interface;
1936+
break;
1937+
}
19311938
}
1932-
return vec;
1933-
}();
1939+
}
19341940

1935-
auto it = std::find_if(bufts.begin(), bufts.end(), [device](const ggml_backend_buffer_type & t) {
1936-
return device == static_cast<ggml_backend_kompute_buffer_type_context *>(t.context)->device;
1937-
});
1938-
return it < bufts.end() ? &*it : nullptr;
1941+
return buft;
19391942
}
19401943

19411944
// backend
@@ -1974,8 +1977,8 @@ static bool ggml_backend_kompute_supports_op(ggml_backend_t backend, const struc
19741977
}
19751978

19761979
static bool ggml_backend_kompute_supports_buft(ggml_backend_t backend, ggml_backend_buffer_type_t buft) {
1977-
GGML_UNUSED(backend);
1978-
return buft->iface.get_name == ggml_backend_kompute_buffer_type_get_name;
1980+
auto *ctx = static_cast<ggml_backend_kompute_context *>(backend->context);
1981+
return &ctx->buft == buft;
19791982
}
19801983

19811984
static struct ggml_backend_i kompute_backend_i = {
@@ -2007,8 +2010,8 @@ static ggml_guid_t ggml_backend_kompute_guid() {
20072010
}
20082011

20092012
ggml_backend_t ggml_backend_kompute_init(int device) {
2010-
GGML_ASSERT(s_kompute_context == nullptr);
2011-
s_kompute_context = new ggml_backend_kompute_context(device);
2013+
if (!s_kompute_context)
2014+
s_kompute_context = new ggml_backend_kompute_context(device);
20122015

20132016
ggml_backend_t kompute_backend = new ggml_backend {
20142017
/* .guid = */ ggml_backend_kompute_guid(),

0 commit comments

Comments
 (0)