Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

zeVirtualMemMap of one physical object into a second VA range returns SUCCESS, then access through it gives ZE_RESULT_ERROR_DEVICE_LOST (Arc Pro B60)

Offen
#536 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
18/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
c, cpp
Bereich
devtools

Rechercherichtung

The repro is a single file, l0_alias_repro.cpp, built against the Level Zero loader (-lze_loader). Start by running it on an Intel GPU to see whether the second zeVirtualMemMap read fails with ZE_RESULT_ERROR_DEVICE_LOST, then look at the compute-runtime handling of physical memory mapped into multiple virtual ranges. Done means the aliased read returns the written bytes or the second map returns an error.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Summary
Mapping the same ze_physical_mem_handle_t into two reserved virtual ranges succeeds (both zeVirtualMemMap calls return ZE_RESULT_SUCCESS). A write through the first range completes, but the first access through the second range fails with ZE_RESULT_ERROR_DEVICE_LOST (0x70000001). From SYCL/PyTorch kernels the same access hangs instead. The spec does not say a physical object may be mapped only once, so either the second map should fail, or the alias should work.

Repro (single file, l0_alias_repro.cpp):

l0_alias_repro.cpp
// Level Zero: one physical memory object mapped into two virtual ranges.
// Writes through range A, then reads through range B with an immediate command list.
// Build: g++ -O1 l0_alias_repro.cpp -I/usr/local/include -L/usr/local/lib -lze_loader -o l0_alias_repro
#include <level_zero/ze_api.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>

#define CHECK(call)                                                       \
  do {                                                                    \
    ze_result_t r = (call);                                               \
    if (r != ZE_RESULT_SUCCESS) {                                         \
      std::printf("%s failed: 0x%x\n", #call, (unsigned)r);              \
      std::exit(1);                                                       \
    }                                                                     \
  } while (0)

int main() {
  CHECK(zeInit(ZE_INIT_FLAG_GPU_ONLY));
  uint32_t n = 1;
  ze_driver_handle_t driver;
  CHECK(zeDriverGet(&n, &driver));
  n = 1;
  ze_device_handle_t device;
  CHECK(zeDeviceGet(driver, &n, &device));
  ze_context_desc_t ctx_desc = {ZE_STRUCTURE_TYPE_CONTEXT_DESC, nullptr, 0};
  ze_context_handle_t ctx;
  CHECK(zeContextCreate(driver, &ctx_desc, &ctx));

  size_t page = 0;
  CHECK(zeVirtualMemQueryPageSize(ctx, device, 2 << 20, &page));
  ze_physical_mem_desc_t pdesc = {ZE_STRUCTURE_TYPE_PHYSICAL_MEM_DESC, nullptr, 0, page};
  ze_physical_mem_handle_t phys;
  CHECK(zePhysicalMemCreate(ctx, device, &pdesc, &phys));

  void *va_a = nullptr, *va_b = nullptr;
  CHECK(zeVirtualMemReserve(ctx, nullptr, page, &va_a));
  CHECK(zeVirtualMemReserve(ctx, nullptr, page, &va_b));
  CHECK(zeVirtualMemMap(ctx, va_a, page, phys, 0, ZE_MEMORY_ACCESS_ATTRIBUTE_READWRITE));
  CHECK(zeVirtualMemMap(ctx, va_b, page, phys, 0, ZE_MEMORY_ACCESS_ATTRIBUTE_READWRITE));
  std::printf("page=%zu va_a=%p va_b=%p: both maps returned SUCCESS\n", page, va_a, va_b);

  ze_command_queue_desc_t qdesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC, nullptr, 0, 0, 0,
                                   ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS, ZE_COMMAND_QUEUE_PRIORITY_NORMAL};
  ze_command_list_handle_t list;
  CHECK(zeCommandListCreateImmediate(ctx, device, &qdesc, &list));

  std::vector<unsigned char> src(page, 0x5a), dst(page, 0);
  CHECK(zeCommandListAppendMemoryCopy(list, va_a, src.data(), page, nullptr, 0, nullptr));
  CHECK(zeCommandListHostSynchronize(list, UINT64_MAX));
  std::printf("write through va_a: done\n");
  std::fflush(stdout);

  CHECK(zeCommandListAppendMemoryCopy(list, dst.data(), va_b, page, nullptr, 0, nullptr));
  // 10 s timeout: on Arc Pro B60 this read never completes
  ze_result_t r = zeCommandListHostSynchronize(list, 10ull * 1000 * 1000 * 1000);
  std::printf("read through va_b: result=0x%x, data %s\n", (unsigned)r,
              r == ZE_RESULT_SUCCESS ? (std::memcmp(src.data(), dst.data(), page) ? "WRONG" : "ok")
                                     : "not available");
  return r == ZE_RESULT_SUCCESS ? 0 : 2;
}
g++ -O1 l0_alias_repro.cpp -I/usr/local/include -L/usr/local/lib -lze_loader -o l0_alias_repro
ZE_AFFINITY_MASK=0 ./l0_alias_repro

Output:

page=2097152 va_a=0x7af6a2000000 va_b=0x7af6a1c00000: both maps returned SUCCESS
write through va_a: done
zeCommandListAppendMemoryCopy(list, dst.data(), va_b, page, nullptr, 0, nullptr) failed: 0x70000001

Expected: the read through va_b returns the bytes written through va_a (as cuMemMap allows on CUDA), or the second zeVirtualMemMap returns an error.

Environment

  • GPU: Intel Arc Pro B60 (Battlemage G21), xe kernel driver, kernel 6.14.0-37-generic
  • compute-runtime (libze-intel-gpu1): 26.18.38308.1
  • Level Zero loader: 1.28.0
  • OS: Ubuntu 25.04

Impact: SGLang's DWDP (expert-weight prefetch for MoE) has to unmap and remap pool pages before every layer on Level Zero instead of aliasing them, which costs a host synchronisation per layer (sgl-project/sglang#40763).

Vorherrschende Sprache
C++
Sterne
337
Forks
140
Ø Merge
9 Std. 25 Min.
Gemergte PRs (30 T.)
13

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus oneapi-src/level-zero

Alle Issues in oneapi-src/level-zero

Ähnliche Issues

Weitere Issues zu C++

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.