Hata kodu: E2003

Kategori: Derleme Süresi: Mozaik Kanıtlanmamış Bellek Erişim Hizalama

Bu hata, derleyici bir bellek erişimi işlemini (ör. vector.load, vector.store, tpu.load veya tpu.store) analiz ettiğinde ve belirli bir boyut için kullanılan dinamik dizinin gerekli döşeme boyutunun katı olduğunu statik olarak kanıtlayamadığında oluşur.

Örnek Hata Mesajları:

INTERNAL: Mosaic failed to compile TPU kernel: cannot statically prove that index in dimension 1 is a multiple of 128

at location: ...

The MLIR operation involved:
  %14372 = "vector.load"(%14371, %93, %14363) : (memref<4x256xf32, #tpu.memory_space<vmem>>, index, index) -> vector<1x32xf32>

XLA Arka Uçları: TPU

Genel Bakış

Çekirdeğiniz bir vektörü yüklediğinde veya depoladığında, bellek adresi (temel işaretçi artı dinamik dizinden hesaplanır) donanımdaki vektörün döşeme boyutuyla eşleşmelidir. Örneğin, bir boyut 128 öğeyle döşenmişse bu boyuta erişmek için kullanılan dinamik dizin 0, 128, 256 vb. olmalıdır. Birçok işlemin (ör. vektör yüklemeleri ve depolamaları) statik dizinler için bu tür gereksinimleri olmadığını unutmayın.

Derleyici, bu koşulu statik analiz kullanarak zorunlu kılar. Dizin değişkeninin geçmişini, onu oluşturan aritmetik işlemler (ör. çarpma, toplama) aracılığıyla izler. Derleyici, sonuçta elde edilen değerin her zaman döşeme boyutuyla bölünebileceğini (derleme zamanında) garanti edemiyorsa bu hatayı verir.

Derleyici, "kanıtlanmış uyumsuzluk" ve "bilinmeyen uyum"u aynı şekilde ele alır. Bu nedenle, matematiksel olarak yanlış hizalanacağı garanti edilen bir dizin kullanıyorsanız (ör. i * 128 + 32) derleyici aynı hatayı verir.

Bu nedenle, bu hata aşağıdaki durumlarda ortaya çıkabilir:

  1. Belleğe erişmek için bir çalışma zamanı değişkeni (dinamik indeks) kullanırsınız.
  2. Dizin hesaplama mantığı, derleyicinin analiz edemeyeceği kadar karmaşık.
  3. Dizin matematiksel olarak geçerli ancak kodda açık bir kanıt yok.
  4. Statik analiz, "kanıtlanmış uyumsuzluk" olduğunu belirler.

Hata ayıklama

Bu hatayı düzeltmek için aşağıdaki seçenekleri kullanabilirsiniz:

1. Eşleşmeyi Açıkça Onaylama

Dizininizin geçerli olduğunu biliyorsanız ancak derleyici bunu kanıtlayamıyorsa tpu.assume_multiple işlemini kullanın. Bu, derleyiciye bir değerin belirli bir faktöre bölünebileceği sözünü verir.

2. Hizalanmış yüklemeleri ve döndürmeyi kullanma

Yanlış hizalamanın kasıtlı olduğu senaryolarda, küçük ve hizalanmamış bir vektör segmenti yüklemek yerine:

  • Daha büyük ve tamamen hizalanmış bir döşeme yükleyin, ardından değerleri dinamik bir miktarda döndürerek istenen verileri yerine taşıyın (dinamik başlangıç dizinlerine sahip vektör dilimleri desteklenmediğinden). veya
  • Verilerin 0 dizininden başlaması ve erişimler arasındaki adımların donanım hizalamasıyla eşleşmesi için tensörü yeniden şekillendirin veya doldurun.
    • Örnek: 1 ofsetinden başlayarak 32 boyutundaki parçaları yinelerseniz ofsetleriniz 1, 33, 65... olur. (hizalanmamış).
    • Düzeltme: Verileri, ilk parçanın 0 olduğu ve boyutun 128'e doldurulduğu yeni bir tensörde yeniden paketleyin. Ofsetleriniz 0, 128, 256... olur ve hizalama koşulunu karşılar.

Bu yöntemler daha fazla bellek tüketir ancak genellikle çekirdek mantığını basitleştirir ve manuel hizalama onaylarına olan ihtiyacı ortadan kaldırır.