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.
Sıralanmamış Erişim Görünümü (UAV) engeli gereksinimleri
Direct3D 12'de UAV engelleri
Direct3D 12'de, aynı komut listesindeki bitişik hesaplama gölgelendiricisi dağıtımlarının, araya giren bir sırasız erişim görünümü (UAV) engeliyle eşitlenmedikleri sürece GPU üzerinde paralel olarak yürütülmesine izin verilir. Bu, GPU donanımlarının kullanımını artırarak performansı artırabilir. Ancak, varsayılan olarak, bir UAV engeli kullanılmadan, iki bitişik gönderimin paralel yürütülmesi, iki gönderim arasında bir veri bağımlılığı varsa bir yarış durumuna neden olabilir; veya her iki gönderim de aynı bellek bölgelerine UAV yazma işlemi gerçekleştiriyorsa.
Bir UAV engeli, daha önce gönderilen tüm gönderimleri, sonraki gönderimler başlamadan önce GPU'da alıştırmayı tamamlamaya zorlar. UAV engelleri, veri yarışlarından kaçınmak için aynı komut listesindeki gönderimler arasında eşitleme yapmak için kullanılır. ID3D12GraphicsCommandList::ResourceBarrier yöntemini kullanarak bir UAV engeli oluşturabilirsiniz.
DirectML'de UAV engelleri
DirectML'de işleçler, işlem gölgelendiricilerinin Direct3D 12'de dağıtıldığı şekilde gönderilir. Diğer bir ifadeyle, aralarında bir "UAV" engeli olmadığı sürece işleçlerin bitişik gönderimleri GPU üzerinde paralel olarak yürütülebilir. Tipik bir makine öğrenmesi modeli, işleçleri arasında veri bağımlılıkları içerir; örneğin, bir işlecin çıkışı başka bir işlecin girişine akışla aktarılır. Bu nedenle, gönderimleri doğru şekilde eşitlemek için UAV engellerini kullanmak önemlidir.
DirectML, yalnızca giriş tensorlarından okuma yapacağını (ve hiçbir zaman yazma yapmayacağını) garanti eder. Ayrıca, hiçbir zaman tensor'un DML_BUFFER_TENSOR_DESC::TotalTensorSizeInBytes üyesi aralığının dışında bir çıkış tensörüne yazma işlemi üretmeyeceğini garanti eder. Bu, DirectML'deki işleçler arasındaki veri bağımlılıklarının yalnızca bir işlecin giriş ve çıkış bağlamalarına bakılarak gerekçelenebileceği anlamına gelir.
Örneğin, bu garantiler bir kaynağın aynı bölgesini giriş olarak bağlayan iki işleci, araya bir UAV engeli eklemek zorunda kalmadan göndermenize olanak sağlar. DirectML hiçbir zaman giriş tensorlarına yazmadığından bu her zaman güvenlidir. Başka bir örnek olarak, DirectML hiçbir zaman bir tensor sınırlarının dışına yazmadığından (tensor'un DML_BUFFER_TENSOR_DESC::TotalTensorSizeInBytes) iki eş zamanlı işlecin çıkış tensorlarını aynı Direct3D 12 kaynağına bağlamak her zaman güvenlidir (tensorları çakışmadığı sürece).
İHA engelleri bir eşitleme biçimi olduğundan, İHA engellerinin gereksiz kullanımı performansı olumsuz etkileyebilir. Bu nedenle, bir komut listesi içindeki gönderimleri doğru şekilde eşitlemek için gereken en az sayıda UAV engelini kullanmanız en iyisidir.
Örnek 1
Aşağıdaki örnekte, bir evrişim işlecinin çıkışı ReLU etkinleştirmesine ve ardından toplu normalizasyona aktarılır.
CONVOLUTION (conv1)
|
ACTIVATION_RELU (relu1)
|
BATCH_NORMALIZATION (batch1)
Üç işleç arasında da bir veri bağımlılığı olduğundan, ardışık her dağıtım arasında bir UAV engeli olması gerekir (bkz. IDMLCommandRecorder::RecordDispatch).
-
dmlCommandRecorder->RecordDispatch(d3d12CommandList,dönş1) -
d3d12CommandList->ResourceBarrier(UAV bariyeri) -
dmlCommandRecorder->RecordDispatch(d3d12CommandList,relu1) -
d3d12CommandList->ResourceBarrier(UAV bariyeri) -
dmlCommandRecorder->RecordDispatch(d3d12CommandList,Parti1)
Örnek 2
MAX_POOLING (pool1)
/ \
CONVOLUTION CONVOLUTION
(conv1) (conv2)
\ /
JOIN (join1)
Burada havuz oluşturma çıktısı, çıkışları JOIN işleci kullanılarak birleştirilmiş olan iki convolution'a aktarılır.
pool1 ve hem conv1 hem de conv2 arasında, ayrıca hem conv1 ve conv2 hem de join1 arasında veri bağımlılığı vardır. Bu grafiği yürütmenin geçerli bir yolu aşağıdadır.
-
dmlCommandRecorder->RecordDispatch(d3d12CommandList,havuz1) -
d3d12CommandList->ResourceBarrier(UAV bariyeri) -
dmlCommandRecorder->RecordDispatch(d3d12CommandList,dönş1) -
dmlCommandRecorder->RecordDispatch(d3d12CommandList,conv2) -
d3d12CommandList->ResourceBarrier(UAV bariyeri) -
dmlCommandRecorder->RecordDispatch(d3d12CommandList,Katıl1)
Bu durumda, conv1 ve conv2 GPU'da eşzamanlı olarak çalıştırılabilir, bu da performansı artırabilir.
Kaynak engel durumu gereksinimleri
Çağıran olarak, GPU'da DirectML gönderimlerini yürütmeden önce tüm Direct3D 12 kaynaklarının doğru kaynak engeli durumunda olduğundan emin olmak sizin sorumluluğunuzdadır. DirectML sizin için herhangi bir geçiş engeli gerçekleştirmez.
GPU'da IDMLCommandRecorder::RecordDispatch yürütmeden önce, tüm bağlı kaynakları D3D12_RESOURCE_STATE_UNORDERED_ACCESS durumuna veya D3D12_RESOURCE_STATE_COMMON gibi D3D12_RESOURCE_STATE_UNORDERED_ACCESS örtük olarak tanıtılabilir bir duruma geçirmelisiniz. Bu çağrı tamamlandıktan sonra kaynaklar D3D12_RESOURCE_STATE_UNORDERED_ACCESS durumunda kalır. Daha fazla ayrıntı için bkz. DirectML'de Bağlama.