Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Direct3D 12 arabellekleri tarafından desteklenen DirectML tensörleri, tensörün boyutları ve adımları olarak bilinen özelliklerle açıklanır. Tensörün boyutları , tensörün mantıksal boyutlarını açıklar. Örneğin, 2B tensorun yüksekliği 2 ve genişliği 3 olabilir. Mantıksal olarak, tensor 6 ayrı öğeye sahiptir, ancak boyutlar bu öğelerin bellekte nasıl depolandığını belirtmez. Tensor'un stride'ları, tensor öğelerinin fiziksel bellek düzenini açıklar.
İki boyutlu (2B) diziler
Yüksekliği 2 ve genişliği 3 olan bir 2B tensor düşünün; veriler metin karakterlerinden oluşur. C/C++ dilinde bu, çok boyutlu bir dizi kullanılarak ifade edilebilir.
constexpr int rows = 2;
constexpr int columns = 3;
char tensor[rows][columns];
tensor[0][0] = 'A';
tensor[0][1] = 'B';
tensor[0][2] = 'C';
tensor[1][0] = 'D';
tensor[1][1] = 'E';
tensor[1][2] = 'F';
Yukarıdaki tensörün mantıksal görünümü aşağıda görselleştirilmiştir.
A B C
D E F
C/C++'da, çok boyutlu bir dizi satır ana sırasına göre depolanır. Başka bir deyişle, genişlik boyutu boyunca ardışık öğeler doğrusal bellek alanında bitişik olarak depolanır.
| Ofset: | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Değer: | A | B | C | D | E | F |
Bir boyutun adım boyu, o boyuttaki bir sonraki öğeye erişmek için atlanması gereken öğe sayısını ifade eder. Strides bellekte tensor düzenini ifade eder. Satır ana sırasıyla, boyut boyunca bitişik öğeler bitişik olarak depolandığından genişlik boyutunun ilerlemesi her zaman 1'dir. Yükseklik boyutunun ilerlemesi genişlik boyutunun boyutuna bağlıdır; yukarıdaki örnekte, yükseklik boyutu boyunca ardışık öğeler arasındaki uzaklık (örneğin, A-D) tensörün genişliğine eşittir (bu örnekte 3'tür).
Farklı bir düzeni göstermek için sütun-ana sırayı göz önünde bulundurun. Başka bir deyişle, yükseklik boyutu boyunca ardışık öğeler doğrusal bellek alanında bitişik olarak depolanır. Bu durumda, yükseklik adımı her zaman 1'dir ve genişlik adımı 2'dir (genişlik boyutunun adımı).
| Ofset: | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Değer: | A | D | B | E | C | F |
Daha yüksek boyutlar
İkiden daha fazla boyut söz konusu olduğunda, bir düzeni satır-baskın veya sütun-baskın olarak adlandırmak uygun değildir. Bu nedenle, bu konunun geri kalanında bunlar gibi terimler ve etiketler kullanılır.
- 2B: "HW"—yükseklik en yüksek sıralı boyutdur (satır-ana).
- 2B: "WH"— genişlik en yüksek düzendeki boyutdur (sütun-ana).
- 3B: "DHW"— burada derinlik en yüksek dereceli boyuttur, bunu yükseklik ve ardından genişlik izler.
- 3B: "WHD"— genişlik en üst düzey boyuttur, ardından yükseklik ve ardından derinlik gelir.
- 4D: "NCHW"— görüntü sayısı (batch size), ardından kanal sayısı, sonra yükseklik, sonra genişlik.
Genel olarak, bir boyutun paketlenmiş adımı, düşük dereceden boyutların ölçülerinin çarpımıdır. Örneğin, "DHW" düzeni ile D-stride H * W'ye eşittir; H-stride W'ye eşittir; ve W-stride değeri 1'e eşittir. Tensorun toplam fiziksel boyutu tensörün toplam mantıksal boyutuna eşit olduğunda adımların paketlendiği söylenir; başka bir deyişle, ek alan veya çakışan öğeler yoktur.
2B örneğini üç boyuta genişletelim, böylece derinlik 2, yükseklik 2 ve genişlik 3 (toplam 12 mantıksal öğe için) olan bir tensöre sahip olalım.
A B C
D E F
G H I
J K L
"DHW" düzeniyle, bu tensor aşağıdaki gibi depolanır.
| Ofset: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Değer: | A | B | C | D | E | F | G | H | Ben | J | K | L |
- D-stride = yükseklik (2) * genişlik (3) = 6 (örneğin, 'A' ile 'G' arasındaki mesafedir).
- H-stride = width (3) = 3 (örneğin, 'A' ile 'D' arasındaki uzaklık).
- W-stride = 1 (örneğin, 'A' ile 'B' arasındaki uzaklık).
Bir öğenin dizinlerinin/koordinatlarının nokta ürünü ve adımlar arabellekteki bu öğeye uzaklığı sağlar. Örneğin, H öğesinin uzaklığı (d=1, h=0, w=1) 7'dir.
{1, 0, 1} ⋅ {6, 3, 1} = 1 * 6 + 0 * 3 + 1 * 1 = 7
Paketlenmiş tensorlar
Yukarıdaki örneklerde paketlenmiş tensorlar gösterilmektedir. Bir tensor, mantıksal boyutu (öğelerde) arabelleğin fiziksel boyutuna (öğelerde) eşit olduğunda ve her öğenin benzersiz bir adresi/uzaklığı bulunduğunda paketlenmiş olduğu söylenir. Örneğin, arabellek 12 öğe uzunluğundaysa ve hiçbir öğe çifti arabellekte aynı uzaklığı paylaşmazsa 2x2x3 tensor paketlenir. Paketlenmiş tensörler en sık rastlanan durumdur; ancak strides daha karmaşık bellek düzenlerine izin verir.
Yayıncılıkta ilerleme
Bir tensörün arabellek boyutu, öge sayısı olarak, mantıksal boyutlarının çarpımından daha küçükse, o zaman bazı ögelerin örtüşmesi ortaya çıkar. Bunun için her zamanki durum yayın olarak bilinir; burada bir boyutun öğeleri başka bir boyutun kopyasıdır. Örneğin, 2B örneği yeniden gözden geçirelim. Mantıksal olarak 2x3 olan bir tensor istediğimizi, ancak ikinci satırın ilk satırla aynı olduğunu düşünelim. Şöyle görünür.
A B C
A B C
Bu, sıkıştırılmış HW/row-major tensor olarak depolanabilir. Ancak daha kompakt bir depolama alanı yalnızca 3 öğe (A, B ve C) içerebilir ve 3 yerine 0 yükseklik adımını kullanır. Bu durumda, tensorun fiziksel boyutu 3 öğedir, ancak mantıksal boyut 6 öğedir.
Genel olarak, bir boyutun adımı 0 ise, alt sıralı boyutlardaki tüm öğeler yayınlanan boyut boyunca tekrarlanır; örneğin, tensor NCHW ve C-stride 0 ise, her kanal H ve W boyunca aynı değerlere sahiptir.
Adımlarla doldurma
Fiziksel boyutu, öğelerini sığdırmak için gereken minimum boyuttan büyükse bir tensörün doldurulmuş olduğu söylenir. Yayın veya çakışan öğe olmadığında, tensörün minimum boyutu (öğelerde) yalnızca boyutlarının ürünüdür. DirectML tensörlerinizin minimum arabellek boyutunu hesaplamak için DMLCalcBufferTensorSize yardımcı işlevini kullanabilirsiniz (bu işlevin listesi için bkz. DirectML yardımcı işlevleri).
Bir arabelleğin aşağıdaki değerleri içerdiğini varsayalım ('x' öğeleri doldurma değerlerini gösterir).
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | x | x | D | E | F | x | x |
Yastıklı tensör, 3 yerine 5'lik bir yükseklik aralığı kullanılarak tanımlanabilir. Bir sonraki satıra geçmek için 3 öğe atlamak yerine, adım 5 öğedir (3 gerçek öğe ve 2 doldurma öğesi). Dolgu, bir görüntünün ikinin kuvveti bir hizalamaya sahip olduğundan emin olmak için bilgisayar grafiklerinde yaygın olarak kullanılır.
A B C
D E F
DirectML tampon tensör açıklamaları
DML_BUFFER_TENSOR_DESC yapısının hem Sizes hem de Strides üyeleri olduğundan, DirectML çeşitli fiziksel tensör düzenleriyle çalışabilir. Bazı işleç uygulamaları belirli bir düzende daha verimli olabilir, bu nedenle daha iyi performans için tensor verilerinin depolanma şeklini değiştirmek yaygın değildir.
Çoğu DirectML işleci 4B veya 5B tensor gerektirir ve boyutların ve adım değerlerinin sırası sabittir. Bir tensor açıklamasında boyutların ve adım değerlerinin sırasını düzelterek DirectML'nin farklı fiziksel düzenleri çıkarabilmesi mümkündür.
4D
- DML_BUFFER_TENSOR_DESC::Boyutlar = { N-boyut, C-boyut, H-boyut, W-boyut }
- DML_BUFFER_TENSOR_DESC::Adımlar = { N-adım, C-adım, H-adım, W-adım }
5D (5 Boyut)
- DML_BUFFER_TENSOR_DESC::Boyutlar = { N-boyut, C-boyut, D-boyut, H-boyut, W-boyut }
- DML_BUFFER_TENSOR_DESC::Adımlar = { N-adım, C-adım, D-adım, H-adım, W-adım }
DirectML işleci 4B veya 5B tensor gerektiriyorsa, ancak gerçek veriler daha küçük bir derecelendirmeye (örneğin, 2B) sahipse, baştaki boyutlar 1'lerle doldurulmalıdır. Örneğin, bir "HW" tensor DML_BUFFER_TENSOR_DESC::Sizes = { 1, 1, H, W } kullanılarak ayarlanır.
Tensor verileri NCHW/NCDHW içinde depolanıyorsa, yayın veya doldurma istemiyorsanız DML_BUFFER_TENSOR_DESC::Strides'ı ayarlamanız gerekmez. Strides alanını olarak nullptrayarlayabilirsiniz. Ancak, tensor verileri NHWC gibi başka bir düzende depolanıyorsa, NCHW'den bu düzene dönüşümü ifade etmek için adımlara ihtiyacınız vardır.
Basit bir örnek için yüksekliği 3 ve genişliği 5 olan 2B tensor açıklamasını göz önünde bulundurun.
Paketlenmiş NCHW (örtük adımlar)
- DML_BUFFER_TENSOR_DESC::Boyutlar = { 1, 1, 3, 5 }
-
DML_BUFFER_TENSOR_DESC::Adımlar =
nullptr
Paketlenmiş NCHW (açık adımlar)
- N-adım = C-boyutu * H-boyutu * W-boyutu = 1 * 3 * 5 = 15
- c-stride = h-size * w-size = 3 * 5 = 15
- H-adımı = W-boyutu = 5
- W-adım = 1
- DML_BUFFER_TENSOR_DESC::Boyutlar = { 1, 1, 3, 5 }
- DML_BUFFER_TENSOR_DESC::Adımlar = { 15, 15, 5, 1 }
Paketlenmiş NHWC
- N-adım = H-boyutu * W-boyutu * C-boyutu = 3 * 5 * 1 = 15
- H-adımı = W-boyutu * C-boyutu = 5 * 1 = 5
- W-adım = C-boyutu = 1
- C-adım = 1
- DML_BUFFER_TENSOR_DESC::Boyutlar = { 1, 1, 3, 5 }
- DML_BUFFER_TENSOR_DESC::Adımlar = { 15, 1, 5, 1 }