@@ -606,6 +606,9 @@ struct clip_ctx {
606606
607607 std::vector<uint8_t > buf_compute_meta;
608608
609+ std::vector<ggml_backend_t > backend_ptrs;
610+ std::vector<ggml_backend_buffer_type_t > backend_buft;
611+
609612 ggml_backend_t backend = nullptr ;
610613 ggml_backend_t backend_cpu = nullptr ;
611614 ggml_backend_buffer_t buf = nullptr ;
@@ -614,6 +617,29 @@ struct clip_ctx {
614617
615618 struct clip_image_size * load_image_size;
616619
620+ clip_ctx (clip_context_params & ctx_params) {
621+ backend_cpu = ggml_backend_init_by_type (GGML_BACKEND_DEVICE_TYPE_CPU, nullptr );
622+ backend = ctx_params.use_gpu
623+ ? ggml_backend_init_by_type (GGML_BACKEND_DEVICE_TYPE_GPU, nullptr )
624+ : nullptr ;
625+
626+ if (backend) {
627+ LOG_INF (" %s: CLIP using %s backend\n " , __func__, ggml_backend_name (backend));
628+ backend_ptrs.push_back (backend);
629+ backend_buft.push_back (ggml_backend_get_default_buffer_type (backend));
630+ } else {
631+ backend = backend_cpu;
632+ LOG_INF (" %s: CLIP using CPU backend\n " , __func__);
633+ }
634+
635+ backend_ptrs.push_back (backend_cpu);
636+ backend_buft.push_back (ggml_backend_get_default_buffer_type (backend_cpu));
637+
638+ sched.reset (
639+ ggml_backend_sched_new (backend_ptrs.data (), backend_buft.data (), backend_ptrs.size (), 8192 , false )
640+ );
641+ }
642+
617643 ~clip_ctx () {
618644 if (ctx_data) {
619645 ggml_free (ctx_data);
@@ -1304,7 +1330,7 @@ struct clip_ctx * clip_init(const char * fname, struct clip_context_params ctx_p
13041330 }
13051331 }
13061332
1307- clip_ctx * new_clip = new clip_ctx{} ;
1333+ clip_ctx * new_clip = new clip_ctx (ctx_params) ;
13081334
13091335 // update projector type
13101336 {
@@ -1323,53 +1349,6 @@ struct clip_ctx * clip_init(const char * fname, struct clip_context_params ctx_p
13231349 }
13241350 }
13251351
1326- std::vector<ggml_backend_buffer_type_t > backend_buft;
1327- std::vector<ggml_backend_t > backend_ptrs;
1328-
1329- new_clip->backend_cpu = ggml_backend_cpu_init ();
1330-
1331- if (ctx_params.use_gpu ) {
1332- #ifdef GGML_USE_CUDA
1333- new_clip->backend = ggml_backend_cuda_init (0 );
1334- LOG_INF (" %s: CLIP using CUDA backend\n " , __func__);
1335- #endif
1336-
1337- #ifdef GGML_USE_METAL
1338- new_clip->backend = ggml_backend_metal_init ();
1339- LOG_INF (" %s: CLIP using Metal backend\n " , __func__);
1340- #endif
1341-
1342- #ifdef GGML_USE_CANN
1343- new_clip->backend = ggml_backend_cann_init (0 );
1344- LOG_INF (" %s: CLIP using CANN backend\n " , __func__);
1345- #endif
1346-
1347- #ifdef GGML_USE_VULKAN
1348- new_clip->backend = ggml_backend_vk_init (0 );
1349- LOG_INF (" %s: CLIP using Vulkan backend\n " , __func__);
1350- #endif
1351-
1352- #ifdef GGML_USE_SYCL
1353- new_clip->backend = ggml_backend_sycl_init (0 );
1354- LOG_INF (" %s: CLIP using SYCL backend\n " , __func__);
1355- #endif
1356- }
1357-
1358- if (new_clip->backend ) {
1359- backend_ptrs.push_back (new_clip->backend );
1360- backend_buft.push_back (ggml_backend_get_default_buffer_type (new_clip->backend ));
1361- } else {
1362- new_clip->backend = new_clip->backend_cpu ;
1363- LOG_INF (" %s: CLIP using CPU backend\n " , __func__);
1364- }
1365-
1366- backend_ptrs.push_back (new_clip->backend_cpu );
1367- backend_buft.push_back (ggml_backend_get_default_buffer_type (new_clip->backend_cpu ));
1368-
1369- new_clip->sched .reset (
1370- ggml_backend_sched_new (backend_ptrs.data (), backend_buft.data (), backend_ptrs.size (), 8192 , false )
1371- );
1372-
13731352 // model size and capabilities
13741353 {
13751354 int idx = get_key_idx (ctx, KEY_HAS_TEXT_ENC);
@@ -1771,9 +1750,9 @@ struct clip_ctx * clip_init(const char * fname, struct clip_context_params ctx_p
17711750 batch.data = nullptr ;
17721751 ggml_cgraph * gf = clip_image_build_graph (new_clip, &batch, nullptr , false );
17731752 ggml_backend_sched_reserve (new_clip->sched .get (), gf);
1774- for (size_t i = 0 ; i < backend_ptrs.size (); ++i) {
1775- ggml_backend_t backend = backend_ptrs[i];
1776- ggml_backend_buffer_type_t buft = backend_buft[i];
1753+ for (size_t i = 0 ; i < new_clip-> backend_ptrs .size (); ++i) {
1754+ ggml_backend_t backend = new_clip-> backend_ptrs [i];
1755+ ggml_backend_buffer_type_t buft = new_clip-> backend_buft [i];
17771756 size_t size = ggml_backend_sched_get_buffer_size (new_clip->sched .get (), backend);
17781757 if (size > 1 ) {
17791758 LOG_INF (" %s: %10s compute buffer size = %8.2f MiB\n " , __func__,
0 commit comments