2015-01-15 14 views
5

için malloc() ve cudaHostAlloc() ile ayrılan verilerin CPU bellek erişim gecikmesi, malloc() ile ayrılan verilerin erişim gecikmesi ile karşılaştırılması ve cudaHostAlloc() ile ayrılan verilerle karşılaştırmalı olarak basit bir test gerçekleştiriyorum ana bilgisayar (işlemci cihaza erişiyor). CudaHostAlloc() ile ayrılan verilere erişmenin, Jetson Tk1'deki malloc() ile ayrılan verilere erişmekten çok daha yavaş olduğunu fark ettim.Tegra TK1

Bu, ayrık GPU'lar için geçerli değildir ve sadece TK1 için geçerli gibi görünmektedir. Bazı araştırmalardan sonra, cudaHostAlloc() ile ayrılan verilerin işlem adres alanının/dev/nvmap alanlarına bellek eşlemeli (mmap) olduğunu buldum. Bu işlem yığını üzerinde eşlenen normal malloc verileri için geçerli değildir. Bu eşlemenin, GPU'nun verilere erişmesine izin vermek için gerekli olabileceğini anlıyorum çünkü cudaHostAlloc'd verileri hem ana bilgisayardan hem de cihazdan görülebilir olmalıdır.

Soruma sorum var: Ana bilgisayardan gelen cudaHostAlloc'd veri erişiminin nereden geldiğini nereden görebilirsiniz? Veri, CPU önbelleklerinde önbelleğe alınmış/dev/nvmap ile eşlenmiş mi?

cevap

5

Bu davranışın nedenini bulmuş olduğuma inanıyorum. Daha sonraki araştırmalardan sonra (Linux trace events kullanarak ve nvmap driver code modeline bakın), ek yükün kaynağının, cudaHostAlloc() ile ayrılan verilerin NVMAP_HANDLE_UNCACHEABLE bayrağını kullanarak "devre dışı bırakılabilir" olarak işaretlendiğinden kaynaklandığını gördüm. İlgili PTE'lerin kaydedilemez olarak işaretlendiğinden emin olmak için pgprot_noncached() numaralı telefona bir çağrı yapılır.

Ana makine erişimlerinin cudaMallocManaged() kullanılarak ayrılan verilere göre davranışı farklıdır. Veri önbelleğe alınacaktır (bayrağı NVMAP_HANDLE_CACHEABLE kullanarak). Bu nedenle, ana bilgisayardan bu verilere erişim malloc()'d verisine eşdeğerdir. CUDA çalışma zamanının, cihazla (GPU), sunucu ile eşzamanlı olarak cudaMallocManaged() ile tahsis edilen herhangi bir verilere erişmesine izin vermediğini ve böyle bir eylemin bir segfault üreteceğini not etmek de önemlidir. Ancak, çalışma zamanı, hem aygıtta hem de ana bilgisayarda cudaHostAlloc()'d verisine eşzamanlı erişime izin verir ve bunun, cudaHostAlloc()'d verilerinin kapatılamamasının nedenlerinden biri olduğuna inanıyorum.