Skip to content

Commit fbe7dfa

Browse files
authored
ggml : add max buffer sizes to opencl and metal backends (#5181)
1 parent 172ac82 commit fbe7dfa

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

ggml-metal.m

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2375,6 +2375,16 @@ GGML_CALL static size_t ggml_backend_metal_buffer_type_get_alignment(ggml_backen
23752375
UNUSED(buft);
23762376
}
23772377

2378+
GGML_CALL static size_t ggml_backend_metal_buffer_type_get_max_size(ggml_backend_buffer_type_t buft) {
2379+
id<MTLDevice> device = ggml_backend_metal_get_device();
2380+
size_t max_size = device.maxBufferLength;
2381+
ggml_backend_metal_free_device();
2382+
2383+
return max_size;
2384+
2385+
UNUSED(buft);
2386+
}
2387+
23782388
GGML_CALL static bool ggml_backend_metal_buffer_type_supports_backend(ggml_backend_buffer_type_t buft, ggml_backend_t backend) {
23792389
return ggml_backend_is_metal(backend) || ggml_backend_is_cpu(backend);
23802390

@@ -2393,7 +2403,7 @@ GGML_CALL ggml_backend_buffer_type_t ggml_backend_metal_buffer_type(void) {
23932403
/* .get_name = */ ggml_backend_metal_buffer_type_get_name,
23942404
/* .alloc_buffer = */ ggml_backend_metal_buffer_type_alloc_buffer,
23952405
/* .get_alignment = */ ggml_backend_metal_buffer_type_get_alignment,
2396-
/* .get_max_size = */ NULL, // TODO: return device.maxBufferLength
2406+
/* .get_max_size = */ ggml_backend_metal_buffer_type_get_max_size,
23972407
/* .get_alloc_size = */ NULL, // defaults to ggml_nbytes
23982408
/* .supports_backend = */ ggml_backend_metal_buffer_type_supports_backend,
23992409
/* .is_host = */ ggml_backend_metal_buffer_type_is_host,

ggml-opencl.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2125,6 +2125,15 @@ static size_t ggml_backend_opencl_buffer_type_get_alignment(ggml_backend_buffer_
21252125
GGML_UNUSED(buffer_type);
21262126
}
21272127

2128+
static size_t ggml_backend_opencl_buffer_type_get_max_size(ggml_backend_buffer_type_t buffer_type) {
2129+
static size_t max_size = -1;
2130+
if (max_size == (size_t)-1) {
2131+
ggml_cl_init();
2132+
clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(size_t), &max_size, NULL);
2133+
}
2134+
return max_size;
2135+
}
2136+
21282137
static bool ggml_backend_opencl_buffer_type_supports_backend(ggml_backend_buffer_type_t buffer_type, ggml_backend_t backend) {
21292138
//return ggml_backend_is_opencl(backend); // opencl must be used through the cpu backend
21302139
return ggml_backend_is_cpu(backend);
@@ -2136,7 +2145,7 @@ static ggml_backend_buffer_type_i ggml_backend_opencl_buffer_type_interface = {
21362145
/* .get_name = */ ggml_backend_opencl_buffer_type_name,
21372146
/* .alloc_buffer = */ ggml_backend_opencl_buffer_type_alloc_buffer,
21382147
/* .get_alignment = */ ggml_backend_opencl_buffer_type_get_alignment,
2139-
/* .get_max_size = */ NULL, // TODO: return from device info
2148+
/* .get_max_size = */ ggml_backend_opencl_buffer_type_get_max_size,
21402149
/* .get_alloc_size = */ NULL,
21412150
/* .supports_backend = */ ggml_backend_opencl_buffer_type_supports_backend,
21422151
/* .is_host = */ NULL,

0 commit comments

Comments
 (0)