@@ -82,6 +82,7 @@ int g_ggml_sycl_use_async_mem_op = 0;
8282int g_ggml_sycl_use_async_mem_op_requested = 1 ;
8383int g_ggml_sycl_enable_level_zero = 0 ;
8484int g_ggml_sycl_enable_flash_attention = 1 ;
85+ int g_ggml_sycl_dev2dev_memcpy = DEV2DEV_MEMCPY_SYCL ;
8586
8687
8788static ggml_sycl_device_info ggml_sycl_init () {
@@ -266,6 +267,11 @@ static void ggml_check_sycl() try {
266267 g_ggml_sycl_enable_level_zero = 0 ;
267268#endif
268269
270+ g_ggml_sycl_dev2dev_memcpy = get_sycl_env (" GGML_SYCL_DEV2DEV_MEMCPY" , DEV2DEV_MEMCPY_SYCL );
271+ if (g_ggml_sycl_enable_level_zero == 0 ) {
272+ g_ggml_sycl_dev2dev_memcpy = DEV2DEV_MEMCPY_SYCL ;
273+ }
274+
269275#ifdef SYCL_FLASH_ATTN
270276 g_ggml_sycl_enable_flash_attention = get_sycl_env (" GGML_SYCL_ENABLE_FLASH_ATTN" , 1 );
271277#else
@@ -316,8 +322,11 @@ static void ggml_check_sycl() try {
316322#endif
317323#ifdef GGML_SYCL_SUPPORT_LEVEL_ZERO
318324 GGML_LOG_INFO (" GGML_SYCL_ENABLE_LEVEL_ZERO: %d\n " , g_ggml_sycl_enable_level_zero);
325+ GGML_LOG_INFO (" GGML_SYCL_DEV2DEV_MEMCPY: %d\n " , g_ggml_sycl_dev2dev_memcpy);
319326#else
320327 GGML_LOG_INFO (" GGML_SYCL_ENABLE_LEVEL_ZERO: Level Zero disabled by compile flag\n " );
328+ GGML_LOG_INFO (" GGML_SYCL_DEV2DEV_MEMCPY: %d, enable to SYCL API since missing GGML_SYCL_SUPPORT_LEVEL_ZERO\n " ,
329+ g_ggml_sycl_dev2dev_memcpy);
321330#endif
322331#if GGML_SYCL_DNNL
323332 GGML_LOG_INFO (" GGML_SYCL_DISABLE_DNN: %d\n " , g_ggml_sycl_disable_dnn);
@@ -584,27 +593,42 @@ static bool ggml_sycl_is_l0_discrete_gpu(sycl::queue &q) {
584593
585594static void dev2dev_memcpy (sycl::queue &q_dst, sycl::queue &q_src, void *ptr_dst,
586595 const void *ptr_src, size_t size) {
596+
587597#ifdef GGML_SYCL_SUPPORT_LEVEL_ZERO
588- // Use Level Zero direct copy for dGPU-to-dGPU transfers.
589- const bool l0_copy_supported =
590- ggml_sycl_is_l0_discrete_gpu (q_dst) && ggml_sycl_is_l0_discrete_gpu (q_src);
591- if (g_ggml_sycl_enable_level_zero && l0_copy_supported) {
592- auto ze_ctx = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(q_dst.get_context ());
593- auto ze_dev = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(q_dst.get_device ());
594- ze_command_queue_desc_t cq_desc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC , nullptr , 0 , 0 ,
595- 0 , ZE_COMMAND_QUEUE_MODE_SYNCHRONOUS , ZE_COMMAND_QUEUE_PRIORITY_NORMAL };
596- ze_command_list_handle_t cl;
597- ze_result_t r = zeCommandListCreateImmediate (ze_ctx, ze_dev, &cq_desc, &cl);
598- if (r == ZE_RESULT_SUCCESS ) {
599- r = zeCommandListAppendMemoryCopy (cl, ptr_dst, ptr_src, size, nullptr , 0 , nullptr );
600- zeCommandListDestroy (cl);
598+ if (g_ggml_sycl_dev2dev_memcpy == DEV2DEV_MEMCPY_L0 ) {
599+ // Use Level Zero direct copy for dGPU-to-dGPU transfers.
600+ const bool l0_copy_supported =
601+ ggml_sycl_is_l0_discrete_gpu (q_dst) && ggml_sycl_is_l0_discrete_gpu (q_src);
602+ if (g_ggml_sycl_enable_level_zero && l0_copy_supported) {
603+
604+ auto ze_ctx = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(q_dst.get_context ());
605+ auto ze_dev = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(q_dst.get_device ());
606+ ze_command_queue_desc_t cq_desc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC , nullptr , 0 , 0 ,
607+ 0 , ZE_COMMAND_QUEUE_MODE_SYNCHRONOUS , ZE_COMMAND_QUEUE_PRIORITY_NORMAL };
608+ ze_command_list_handle_t cl;
609+ ze_result_t r = zeCommandListCreateImmediate (ze_ctx, ze_dev, &cq_desc, &cl);
601610 if (r == ZE_RESULT_SUCCESS ) {
602- return ;
611+ GGML_SYCL_DEBUG (" [SYCL] dev2dev memcpy by L0\n " );
612+ r = zeCommandListAppendMemoryCopy (cl, ptr_dst, ptr_src, size, nullptr , 0 , nullptr );
613+ zeCommandListDestroy (cl);
614+ if (r == ZE_RESULT_SUCCESS ) {
615+ return ;
616+ }
603617 }
604618 }
605619 }
606620#endif
621+
622+ if (g_ggml_sycl_dev2dev_memcpy == DEV2DEV_MEMCPY_SYCL ) {
623+ if (q_dst.get_device ().get_platform () == q_src.get_device ().get_platform ()){
624+ GGML_SYCL_DEBUG (" [SYCL] dev2dev memcpy by SYCL\n " );
625+ SYCL_CHECK (CHECK_TRY_ERROR (q_dst.memcpy (ptr_dst, ptr_src, size).wait ()));
626+ return ;
627+ }
628+ }
629+
607630 // Host-staged copy
631+ GGML_SYCL_DEBUG (" [SYCL] dev2dev memcpy by host forward\n " );
608632 char *host_buf = (char *)malloc (size);
609633 q_src.memcpy (host_buf, (const char *)ptr_src, size).wait ();
610634 q_dst.memcpy ((char *)ptr_dst, host_buf, size).wait ();
0 commit comments