4141#if SYCL_EXT_ONEAPI_VIRTUAL_MEM
4242# include < sycl/ext/oneapi/virtual_mem/physical_mem.hpp>
4343# include < sycl/ext/oneapi/virtual_mem/virtual_mem.hpp>
44- # define GGML_SYCL_USE_VMM
44+ # define GGML_SYCL_SUPPORT_VMM
4545#endif
4646#include < sycl/half_type.hpp>
4747
8080
8181static bool g_sycl_loaded = false ;
8282int g_ggml_sycl_debug = 0 ;
83- int g_ggml_sycl_disable_optimize = 0 ;
84- int g_ggml_sycl_disable_graph = 0 ;
85- int g_ggml_sycl_disable_dnn = 0 ;
83+ int g_ggml_sycl_enable_optimize = 1 ;
84+ int g_ggml_sycl_enable_graph = 0 ;
85+ int g_ggml_sycl_enable_dnn = 1 ;
8686int g_ggml_sycl_enable_vmm = 1 ;
8787int g_ggml_sycl_prioritize_dmmv = 0 ;
8888int g_ggml_sycl_use_async_mem_op = 0 ;
@@ -117,7 +117,7 @@ static ggml_sycl_device_info ggml_sycl_init() {
117117 SYCL_CHECK (CHECK_TRY_ERROR (dpct::get_device_info (
118118 prop, device)));
119119
120- #if !defined(GGML_SYCL_USE_VMM )
120+ #if !defined(GGML_SYCL_SUPPORT_VMM )
121121 info.devices [i].vmm = 0 ;
122122#else
123123 info.devices [i].vmm = device.has (sycl::aspect::ext_oneapi_virtual_mem);
@@ -265,14 +265,24 @@ void ggml_backend_sycl_print_sycl_devices() {
265265 print_device_opt_feature (device_count);
266266}
267267
268+ static const char * dev2dev_int2str (int dev2dev) {
269+ if (dev2dev == DEV2DEV_MEMCPY_SYCL ) {
270+ return " SYCL API" ;
271+ } else if (dev2dev == DEV2DEV_MEMCPY_L0 ) {
272+ return " Level Zero API" ;
273+ } else {
274+ return " Unknown" ;
275+ }
276+ }
277+
268278static void ggml_check_sycl () try {
269279 static bool initialized = false ;
270280
271281 if (!initialized) {
272282 g_ggml_sycl_debug = ggml_sycl_get_env (" GGML_SYCL_DEBUG" , 0 );
273- g_ggml_sycl_disable_optimize = ggml_sycl_get_env (" GGML_SYCL_DISABLE_OPT " , 0 );
274- g_ggml_sycl_disable_graph = ggml_sycl_get_env (" GGML_SYCL_DISABLE_GRAPH " , 1 );
275- g_ggml_sycl_disable_dnn = ggml_sycl_get_env (" GGML_SYCL_DISABLE_DNN " , 0 );
283+ g_ggml_sycl_enable_optimize = ggml_sycl_get_env (" GGML_SYCL_ENABLE_OPT " , 1 );
284+ g_ggml_sycl_enable_graph = ggml_sycl_get_env (" GGML_SYCL_ENABLE_GRAPH " , 0 );
285+ g_ggml_sycl_enable_dnn = ggml_sycl_get_env (" GGML_SYCL_ENABLE_DNN " , 1 );
276286 g_ggml_sycl_enable_vmm = ggml_sycl_get_env (" GGML_SYCL_ENABLE_VMM" , 1 );
277287 g_ggml_sycl_prioritize_dmmv = ggml_sycl_get_env (" GGML_SYCL_PRIORITIZE_DMMV" , 0 );
278288
@@ -292,72 +302,87 @@ static void ggml_check_sycl() try {
292302 GGML_SYCL_DEBUG (" [SYCL] call ggml_check_sycl\n " );
293303
294304 GGML_LOG_INFO (" Build with Macros:\n " );
295- #if defined(GGML_SYCL_FORCE_MMQ )
296- GGML_LOG_INFO (" GGML_SYCL_FORCE_MMQ : yes\n " );
305+ #if defined(GGML_SYCL_DNNL )
306+ GGML_LOG_INFO (" GGML_SYCL_DNNL : yes\n " );
297307#else
298- GGML_LOG_INFO (" GGML_SYCL_FORCE_MMQ : no\n " );
308+ GGML_LOG_INFO (" GGML_SYCL_DNNL : no\n " );
299309#endif
310+
300311#if defined(GGML_SYCL_F16)
301312 GGML_LOG_INFO (" GGML_SYCL_F16: yes\n " );
302313#else
303314 GGML_LOG_INFO (" GGML_SYCL_F16: no\n " );
304315#endif
316+
317+ #if defined(GGML_SYCL_FORCE_MMQ)
318+ GGML_LOG_INFO (" GGML_SYCL_FORCE_MMQ: yes\n " );
319+ #else
320+ GGML_LOG_INFO (" GGML_SYCL_FORCE_MMQ: no\n " );
321+ #endif
322+
305323#if defined(GGML_SYCL_GRAPH)
306324 GGML_LOG_INFO (" GGML_SYCL_GRAPH: yes\n " );
307325#else
308326 GGML_LOG_INFO (" GGML_SYCL_GRAPH: no\n " );
309327#endif
310- #if defined(GGML_SYCL_DNNL)
311- GGML_LOG_INFO (" GGML_SYCL_DNNL: yes\n " );
312- #else
313- GGML_LOG_INFO (" GGML_SYCL_DNNL: no\n " );
314- #endif
328+
315329#if defined(GGML_SYCL_SUPPORT_LEVEL_ZERO_API)
316330 GGML_LOG_INFO (" GGML_SYCL_SUPPORT_LEVEL_ZERO_API: yes\n " );
317331#else
318332 GGML_LOG_INFO (" GGML_SYCL_SUPPORT_LEVEL_ZERO_API: no\n " );
319333#endif
320- #if defined(GGML_SYCL_USE_VMM )
321- GGML_LOG_INFO (" GGML_SYCL_USE_VMM : yes\n " );
334+ #if defined(GGML_SYCL_SUPPORT_VMM )
335+ GGML_LOG_INFO (" GGML_SYCL_SUPPORT_VMM : yes\n " );
322336#else
323- GGML_LOG_INFO (" GGML_SYCL_USE_VMM : no\n " );
337+ GGML_LOG_INFO (" GGML_SYCL_SUPPORT_VMM : no\n " );
324338#endif
325339
326340 GGML_LOG_INFO (" Running with Environment Variables:\n " );
327341 GGML_LOG_INFO (" GGML_SYCL_DEBUG: %d\n " , g_ggml_sycl_debug);
328- GGML_LOG_INFO ( " GGML_SYCL_DISABLE_OPT: %d \n " , g_ggml_sycl_disable_optimize);
329- #ifdef GGML_SYCL_GRAPH
330- GGML_LOG_INFO (" GGML_SYCL_DISABLE_GRAPH : %d\n " , g_ggml_sycl_disable_graph );
342+
343+ #ifdef GGML_SYCL_SUPPORT_LEVEL_ZERO_API
344+ GGML_LOG_INFO (" GGML_SYCL_DEV2DEV_MEMCPY : %d (%s) \n " , g_ggml_sycl_dev2dev_memcpy, dev2dev_int2str (g_ggml_sycl_dev2dev_memcpy) );
331345#else
332- GGML_LOG_INFO (" GGML_SYCL_DISABLE_GRAPH: graph disabled by compile flag\n " );
346+ GGML_LOG_INFO (" GGML_SYCL_DEV2DEV_MEMCPY: %d (%s), enable to SYCL API since missing GGML_SYCL_SUPPORT_LEVEL_ZERO_API\n " ,
347+ g_ggml_sycl_dev2dev_memcpy, dev2dev_int2str (g_ggml_sycl_dev2dev_memcpy));
333348#endif
334- # ifdef GGML_SYCL_SUPPORT_LEVEL_ZERO_API
335- GGML_LOG_INFO ( " GGML_SYCL_USE_LEVEL_ZERO_API: %d \n " , g_ggml_sycl_use_level_zero_api);
336- GGML_LOG_INFO (" GGML_SYCL_DEV2DEV_MEMCPY : %d\n " , g_ggml_sycl_dev2dev_memcpy );
349+
350+ # if defined(GGML_SYCL_DNNL)
351+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_DNN : %d\n " , g_ggml_sycl_enable_dnn );
337352#else
338- GGML_LOG_INFO (" GGML_SYCL_USE_LEVEL_ZERO_API: Disable Level Zero API usage by compile flag\n " );
339- GGML_LOG_INFO (" GGML_SYCL_DEV2DEV_MEMCPY: %d, enable to SYCL API since missing GGML_SYCL_SUPPORT_LEVEL_ZERO_API\n " ,
340- g_ggml_sycl_dev2dev_memcpy);
353+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_DNN: DNN disabled by compile flag\n " );
341354#endif
342- #if GGML_SYCL_DNNL
343- GGML_LOG_INFO (" GGML_SYCL_DISABLE_DNN: %d\n " , g_ggml_sycl_disable_dnn);
355+
356+ #ifdef SYCL_FLASH_ATTN
357+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_FLASH_ATTN: %d\n " , g_ggml_sycl_enable_flash_attention);
344358#else
345- GGML_LOG_INFO (" GGML_SYCL_DISABLE_DNN: DNN disabled by compile flag\n " );
359+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_FLASH_ATTN: %d disabled by compile flag\n " ,
360+ g_ggml_sycl_enable_flash_attention);
346361#endif
347- #if defined(GGML_SYCL_USE_VMM)
362+
363+ #ifdef GGML_SYCL_GRAPH
364+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_GRAPH: %d\n " , g_ggml_sycl_enable_graph);
365+ #else
366+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_GRAPH: graph disabled by compile flag\n " );
367+ #endif
368+
369+ GGML_LOG_INFO (" GGML_SYCL_ENABLE_OPT: %d\n " , g_ggml_sycl_enable_optimize);
370+
371+ #if defined(GGML_SYCL_SUPPORT_VMM)
348372 GGML_LOG_INFO (" GGML_SYCL_ENABLE_VMM: %d\n " , g_ggml_sycl_enable_vmm);
349373#else
350374 GGML_LOG_INFO (" GGML_SYCL_ENABLE_VMM: virtual memory extension is not available\n " );
351375#endif
376+
352377 GGML_LOG_INFO (" GGML_SYCL_PRIORITIZE_DMMV: %d\n " , g_ggml_sycl_prioritize_dmmv);
378+
353379 g_ggml_sycl_use_async_mem_op_requested = ggml_sycl_get_env (" GGML_SYCL_USE_ASYNC_MEM_OP" , 1 );
354380 GGML_LOG_INFO (" GGML_SYCL_USE_ASYNC_MEM_OP: %d\n " , g_ggml_sycl_use_async_mem_op_requested);
355381
356- #ifdef SYCL_FLASH_ATTN
357- GGML_LOG_INFO (" GGML_SYCL_ENABLE_FLASH_ATTN : %d\n " , g_ggml_sycl_enable_flash_attention );
382+ #ifdef GGML_SYCL_SUPPORT_LEVEL_ZERO_API
383+ GGML_LOG_INFO (" GGML_SYCL_USE_LEVEL_ZERO_API : %d\n " , g_ggml_sycl_use_level_zero_api );
358384#else
359- GGML_LOG_INFO (" GGML_SYCL_ENABLE_FLASH_ATTN: %d disabled by compile flag\n " ,
360- g_ggml_sycl_enable_flash_attention);
385+ GGML_LOG_INFO (" GGML_SYCL_USE_LEVEL_ZERO_API: Disable Level Zero API usage by compile flag\n " );
361386#endif
362387
363388 GGML_LOG_INFO (" GGML_SYCL_USM_SYSTEM: %d\n " , g_ggml_sycl_usm_system);
@@ -373,7 +398,7 @@ static void ggml_check_sycl() try {
373398 // staging path while preserving queue ordering semantics. Graph support still depends on the extension being
374399 // available, but it no longer needs to control the non-graph fast path.
375400#if defined(GGML_SYCL_GRAPH) && SYCL_EXT_ONEAPI_ASYNC_MEMORY_ALLOC
376- g_ggml_sycl_use_async_mem_op = g_ggml_sycl_use_async_mem_op_requested || !g_ggml_sycl_disable_graph ;
401+ g_ggml_sycl_use_async_mem_op = g_ggml_sycl_use_async_mem_op_requested || g_ggml_sycl_enable_graph ;
377402 if (g_ggml_sycl_use_async_mem_op) {
378403 for (unsigned int i = 0 ; i < dpct::dev_mgr::instance ().device_count (); ++i) {
379404 if (!dpct::dev_mgr::instance ().get_device (i).has (sycl::aspect::ext_oneapi_async_memory_alloc)) {
@@ -516,7 +541,7 @@ ggml_backend_sycl_buffer_init_tensor(ggml_backend_buffer_t buffer,
516541 return GGML_STATUS_SUCCESS ;
517542 }
518543
519- if (!g_ggml_sycl_disable_optimize ) {
544+ if (g_ggml_sycl_enable_optimize ) {
520545 // set reorder extra buffer based on supported type
521546 switch (tensor->type ) {
522547 case GGML_TYPE_Q4_0 :
@@ -1562,7 +1587,7 @@ struct ggml_sycl_pool_leg : public ggml_sycl_pool {
15621587};
15631588
15641589// pool with virtual memory management
1565- #if defined(GGML_SYCL_USE_VMM )
1590+ #if defined(GGML_SYCL_SUPPORT_VMM )
15661591struct ggml_sycl_pool_vmm : public ggml_sycl_pool {
15671592 static const size_t SYCL_POOL_VMM_MAX_SIZE = 1ull << 35 ; // 32 GB
15681593
@@ -1674,7 +1699,7 @@ struct ggml_sycl_pool_vmm : public ggml_sycl_pool {
16741699 GGML_ASSERT (ptr == reinterpret_cast <void *>(pool_addr + pool_used));
16751700 }
16761701};
1677- #endif // defined(GGML_SYCL_USE_VMM )
1702+ #endif // defined(GGML_SYCL_SUPPORT_VMM )
16781703
16791704struct ggml_sycl_pool_host : public ggml_sycl_pool {
16801705 queue_ptr qptr;
@@ -1756,11 +1781,11 @@ std::unique_ptr<ggml_sycl_pool> ggml_backend_sycl_context::new_pool_for_host(que
17561781}
17571782
17581783std::unique_ptr<ggml_sycl_pool> ggml_backend_sycl_context::new_pool_for_device (queue_ptr qptr, int device) {
1759- #if defined(GGML_SYCL_USE_VMM )
1784+ #if defined(GGML_SYCL_SUPPORT_VMM )
17601785 if (g_ggml_sycl_enable_vmm && ggml_sycl_info ().devices [device].vmm ) {
17611786 return std::unique_ptr<ggml_sycl_pool>(new ggml_sycl_pool_vmm (qptr, device));
17621787 }
1763- #endif // defined(GGML_SYCL_USE_VMM )
1788+ #endif // defined(GGML_SYCL_SUPPORT_VMM )
17641789 return std::unique_ptr<ggml_sycl_pool>(new ggml_sycl_pool_leg (qptr, device));
17651790}
17661791
@@ -2429,7 +2454,7 @@ inline void ggml_sycl_op_mul_mat_sycl(
24292454
24302455#if GGML_SYCL_DNNL && defined(GGML_SYCL_HAS_BF16)
24312456 // Fast path for bf16 src0
2432- if (src0->type == GGML_TYPE_BF16 && !g_ggml_sycl_disable_dnn && ggml_is_contiguous (src0) &&
2457+ if (src0->type == GGML_TYPE_BF16 && g_ggml_sycl_enable_dnn && ggml_is_contiguous (src0) &&
24332458 row_diff == src0->ne [1 ]) {
24342459 using bf16_t = sycl::ext::oneapi::bfloat16;
24352460 ggml_sycl_pool_alloc<bf16_t > src1_as_bf16 (ctx.pool (), src1_ncols*ne10);
@@ -2482,7 +2507,7 @@ inline void ggml_sycl_op_mul_mat_sycl(
24822507 : src1_as_f16.get ();
24832508
24842509#if GGML_SYCL_DNNL
2485- if (!g_ggml_sycl_disable_dnn ) {
2510+ if (g_ggml_sycl_enable_dnn ) {
24862511 DnnlGemmWrapper::row_gemm (ctx,row_diff, src1_ncols , ne10, src0_ptr,
24872512 DnnlGemmWrapper::to_dt<sycl::half>(), src1_ptr, DnnlGemmWrapper::to_dt<sycl::half>(),
24882513 dst_dd_i, DnnlGemmWrapper::to_dt<float >(), stream);
@@ -2532,7 +2557,7 @@ inline void ggml_sycl_op_mul_mat_sycl(
25322557 const int64_t gemm_flops = (int64_t )row_diff * src1_ncols * ne10;
25332558 const bool use_mkl_direct = gemm_flops < 256 * 256 * 256 ;
25342559#if GGML_SYCL_DNNL
2535- if (!g_ggml_sycl_disable_dnn && !use_mkl_direct) {
2560+ if (g_ggml_sycl_enable_dnn && !use_mkl_direct) {
25362561 DnnlGemmWrapper::row_gemm (ctx, row_diff, src1_ncols, ne10, src0_ddf_i,
25372562 DnnlGemmWrapper::to_dt<float >(), src1_ddf1_i, DnnlGemmWrapper::to_dt<float >(),
25382563 dst_dd_i, DnnlGemmWrapper::to_dt<float >(), stream);
@@ -3352,7 +3377,7 @@ static void ggml_sycl_mul_mat_batched_sycl(ggml_backend_sycl_context & ctx, cons
33523377 const int64_t r3 = ne13 / ne03;
33533378
33543379#if GGML_SYCL_DNNL
3355- if (!g_ggml_sycl_disable_dnn ) {
3380+ if (g_ggml_sycl_enable_dnn ) {
33563381 int64_t str_a0 = nb00 / type_size_src0;
33573382 int64_t str_a1 = nb01 / type_size_src0;
33583383 int64_t str_a2 = nb02 / type_size_src0;
@@ -4092,12 +4117,12 @@ static bool reorder_qw(const ggml_tensor * src0, dpct::queue_ptr stream) {
40924117}
40934118
40944119static bool should_reorder_tensor (ggml_backend_sycl_context& ctx, const ggml_tensor * dst) {
4095- return !g_ggml_sycl_disable_optimize && // allow optimize, controlled by $GGML_SYCL_DISABLE_OPT
4096- ctx.opt_feature .reorder && // allow this device due to good perf, skip the devices with bad perf.
4097- dst->op == GGML_OP_MUL_MAT && // limit to some supported cases of Q4_0, to do for more cases.
4098- // ne[1] <= 8 so multi-column decode (spec / MTP verify) also bootstraps the reorder;
4099- // all reorderable types have a _switch_ncols kernel.
4100- dst->src [1 ]->ne [1 ] <= 8 && dst->src [1 ]->ne [2 ]==1 && dst->src [1 ]->ne [3 ]==1 ;
4120+ return g_ggml_sycl_enable_optimize && // allow optimize, controlled by $GGML_SYCL_ENABLE_OPT
4121+ ctx.opt_feature .reorder && // allow this device due to good perf, skip the devices with bad perf.
4122+ dst->op == GGML_OP_MUL_MAT && // limit to some supported cases of Q4_0, to do for more cases.
4123+ // ne[1] <= 8 so multi-column decode (spec / MTP verify) also bootstraps the reorder;
4124+ // all reorderable types have a _switch_ncols kernel.
4125+ dst->src [1 ]->ne [1 ] <= 8 && dst->src [1 ]->ne [2 ]==1 && dst->src [1 ]->ne [3 ]==1 ;
41014126}
41024127
41034128static void opt_for_reorder (ggml_backend_sycl_context * ctx, const ggml_tensor * src0, const ggml_tensor * /* src1 */ ,
@@ -4136,7 +4161,7 @@ static void opt_for_reorder(ggml_backend_sycl_context * ctx, const ggml_tensor *
41364161
41374162// Lazily reorder supported MoE expert weights once their fused path is used.
41384163static void opt_for_reorder_id (ggml_backend_sycl_context * ctx, const ggml_tensor * src0) {
4139- if (g_ggml_sycl_disable_optimize || !ctx->opt_feature .reorder ) {
4164+ if (!g_ggml_sycl_enable_optimize || !ctx->opt_feature .reorder ) {
41404165 return ;
41414166 }
41424167 if (src0->type != GGML_TYPE_Q4_K && src0->type != GGML_TYPE_Q5_K && src0->type != GGML_TYPE_Q6_K ) {
@@ -5204,7 +5229,10 @@ static ggml_status ggml_backend_sycl_graph_compute(ggml_backend_t backend, ggml_
52045229 auto * sycl_ctx = static_cast <ggml_backend_sycl_context *>(backend->context );
52055230
52065231#ifdef GGML_SYCL_GRAPH
5207- bool use_sycl_graph = !g_ggml_sycl_disable_graph && check_graph_compatibility (cgraph);
5232+ bool use_sycl_graph = false ;
5233+ if (g_ggml_sycl_enable_graph) {
5234+ use_sycl_graph = check_graph_compatibility (cgraph);
5235+ }
52085236 if (use_sycl_graph) {
52095237 const bool graph_support = dpct::get_device (sycl_ctx->device ).has (sycl::aspect::ext_oneapi_limited_graph);
52105238 if (!graph_support) {
0 commit comments