reverse check order

This commit is contained in:
Ruben Ortlam
2026-08-25 12:19:26 +02:00
parent 50e0a2dd81
commit e46b3ae5ff
+20 -20
View File
@@ -9392,29 +9392,11 @@ static vk_d2d_path ggml_vk_probe_d2d_path(vk_device& src_dev, vk_device& dst_dev
bool cross_vendor_nvidia = src_nvidia != dst_nvidia;
// 1. dmabuf_p2p — skip if cross-vendor NVIDIA
// Try write direction first: dst exports VRAM, src imports and writes into it.
// PCIe posted writes are generally faster than reads (5-11x on AMD-to-AMD).
// Try read direction first: src exports VRAM, dst imports and reads from it.
// DMA reads from peer VRAM tend to be faster than writes on AMD GPUs.
if (src_dev->external_memory_dma_buf && dst_dev->external_memory_dma_buf && !cross_vendor_nvidia) {
vk_buffer exp_buf, imp_buf;
// Try dst exports VRAM, src imports (write direction)
if (ggml_vk_d2d_try_dma_buf(dst_dev, src_dev, VK_D2D_PROBE_SIZE, true, exp_buf, imp_buf)) {
if (ggml_vk_d2d_test_copy(src_dev, imp_buf, VK_D2D_PROBE_SIZE)) {
path.method = D2D_DMABUF_P2P;
path.reverse_direction = true;
path.slots[0].buf_a = exp_buf;
path.slots[0].buf_b = imp_buf;
path.num_slots = 1;
path.size = VK_D2D_PROBE_SIZE;
GGML_LOG_DEBUG("ggml_vulkan: d2d %s -> %s: dmabuf_p2p (dst exports VRAM)\n",
src_dev->name.c_str(), dst_dev->name.c_str());
ggml_vk_d2d_setup_sync(src_dev, dst_dev, path);
return path;
}
ggml_vk_destroy_buffer(exp_buf);
ggml_vk_destroy_buffer(imp_buf);
}
// Try src exports VRAM, dst imports (read direction)
if (ggml_vk_d2d_try_dma_buf(src_dev, dst_dev, VK_D2D_PROBE_SIZE, true, exp_buf, imp_buf)) {
if (ggml_vk_d2d_test_copy(dst_dev, imp_buf, VK_D2D_PROBE_SIZE)) {
@@ -9432,6 +9414,24 @@ static vk_d2d_path ggml_vk_probe_d2d_path(vk_device& src_dev, vk_device& dst_dev
ggml_vk_destroy_buffer(exp_buf);
ggml_vk_destroy_buffer(imp_buf);
}
// Try dst exports VRAM, src imports (write direction)
if (ggml_vk_d2d_try_dma_buf(dst_dev, src_dev, VK_D2D_PROBE_SIZE, true, exp_buf, imp_buf)) {
if (ggml_vk_d2d_test_copy(src_dev, imp_buf, VK_D2D_PROBE_SIZE)) {
path.method = D2D_DMABUF_P2P;
path.reverse_direction = true;
path.slots[0].buf_a = exp_buf;
path.slots[0].buf_b = imp_buf;
path.num_slots = 1;
path.size = VK_D2D_PROBE_SIZE;
GGML_LOG_DEBUG("ggml_vulkan: d2d %s -> %s: dmabuf_p2p (dst exports VRAM)\n",
src_dev->name.c_str(), dst_dev->name.c_str());
ggml_vk_d2d_setup_sync(src_dev, dst_dev, path);
return path;
}
ggml_vk_destroy_buffer(exp_buf);
ggml_vk_destroy_buffer(imp_buf);
}
}
// 2. dmabuf_gtt