2012-09-17 10 views
5

Sabitlenmiş bellek oluşturma hakkında sorularım var.Cularda sabitlenmiş belleğe vektör tipi değer nasıl yapılır

Şimdi büyük boyutlu veriyle ilgilenmek için CUDA kullanıyorum.

Çalışma süresini azaltmak için, bellek kopyalama ve çekirdek başlatmanın çakışması gerektiğini anladım.

Bazı metinleri ve web sayfalarını, bellek kopyalama ve çekirdek başlatmayı örtüştükten sonra, ana bilgisayar belleğini sabitlenmiş belleğe ayıracak olan cudaMallocHost kullanarak ana bilgisayar belleğini ayırmanın gerekli olduğunu fark ettim.
Konakta tam sayı veya dizi tipi kullanılması durumunda sabitlenmiş bellek yapmak çok kolaydı. Bunun gibi

...
cudaStream_t* streams = (cudaStream_t*)malloc(MAX_num_stream * sizeof(cudaStream_t)); 
for(i=0; i<MAX_num_stream; i++) 
    cudaStreamCreate(&(streams[i])); 

cudaMallocHost(&departure, its_size); 

for(n=1; ... ; n++){ 
    cudaMemcpyAsync(... streams[n]); 
    kernel <<< ... , ... , ... , streams[n] >>> (...); 
} 

Ama benim durumumda

, benim ev sahibi kalkış hafıza vertor türüne göre ayarlanır.

Ayrıca, cudaMallocHost kullanarak vektör tipi ana bellek türünü sabitlenmiş belleğe dönüştürmenin yollarını bulamıyorum.

Bu sorunu çözmek için bana yardımcı olun veya tavsiyelerde bulunun. Fakir İngilizcemi okuduğunuz için teşekkür ederim. Teşekkürler.

+1

"Vektör türü" ile tam olarak ne demek istiyorsunuz? C++ 'std :: vector' mu, yoksa başka bir şey mi? – talonmies

+0

Evet. Std :: vektörünü kastediyorum. – Umbrella

cevap

4

Doğrudan, cudaMallocHost kullanarak başka bir POD türü için bellek ayıramazsınız. Eğer gerçekten iğnelenmiş bellek kullanan bir std::vector ihtiyaç olursa

, dahili olarak cudaMallocHost çağırır std::allocator kendi modeli uygulamak ve söz konusu özel ayırıcısı kullanarak sizin std::vector örneğini gerekecektir.

Alternatif thrust template library (CUDA araç seti son sürümlerindeki gemiler) Eğer iteself std::vector bir modelini olduğu bindirmeler kendi vektör sınıfı ile kullanabilirsiniz deneysel sabitlenmiş bellek ayırıcısı içerir.

+0

Teşekkürler talonyalar. Bu içerik benim durumum için yardımcı oldu. – Umbrella

+0

Ve benim bir tane daha küçük sorum var. CudaMallocHost olmadan cudaMemcpyAsync ve çekirdeği kullanmak doğru mudur? Ev sahibi sabitlenmiş bellek yapmadan Asenkron kod yapmaya çalışıyordum ama bu iyi çalıştı. Genel mi yoksa tesadüfi mi? – Umbrella

+1

10 Evet, işe yarayacak, ancak aktarımlar herhangi bir aktarım için> 64kb'de eşzamanlı olmayacak. Ana makine API çağrısı hemen döner, ancak kopya tamamlanana kadar aygıt engellenir, örn. eşzamanlı çekirdek yürütme ve bellek kopyası veya "cudaMemcpyAsync" nin diğer yararları yok. – talonmies

İlgili konular