2012-09-17 9 views
5

Mam pytania dotyczące tworzenia przypiętej pamięci.Jak zrobić wektorową wartość typu przypięta pamięć w cuda

Teraz używam CUDA do obsługi dużych rozmiarów danych.

Aby skrócić czas działania, muszę się upewnić, że konieczne jest nałożenie na siebie kopii pamięci i uruchomienie jądra.

Po przeszukiwaniu niektórych tekstów i stron internetowych, nakładaniu się kopii pamięci i uruchamianiu jądra, zauważam, że konieczne jest przydzielenie pamięci hosta za pomocą programu cudaMallocHost, który przydzieli pamięć hosta do przypiętej pamięci.
W przypadku używania typu integer lub tablica na hoście, łatwo było przypiąć pamięć.

podobnie jak ten ...

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] >>> (...); 
} 

Ale w moim przypadku, mój gospodarz pamięć odejście jest ustawiony według typu vertor.

I nie mogę znaleźć nigdzie sposobu, aby zamienić pamięć wektorową hosta w przypiętą pamięć za pomocą cudaMallocHost.

Pomóż mi lub poradź się, jak rozwiązać ten problem. Dziękuję za przeczytanie mojego słabego angielskiego. Dzięki.

+1

Co dokładnie masz na myśli przez "typ wektorowy"? Masz na myśli C++ 'std :: vector', czy coś innego? – talonmies

+0

Tak. Mam na myśli std :: vector. – Umbrella

Odpowiedz

4

Bezpośrednio nie można przydzielić pamięci dla żadnych innych typów POD za pomocą cudaMallocHost.

Jeśli naprawdę potrzebują std::vector który wykorzystuje przypięte pamięć, trzeba będzie wdrożyć swój własny model std::allocator który wywołuje cudaMallocHost wewnętrznie i instancję swoje std::vector użyciu tego niestandardowego przydzielania.

Alternatywnie thrust template library (co zwykle w ostatnich wydaniach CUDA Toolkit) zawiera eksperymentalne przypięte przydzielania pamięci, które można używać z pchnięć własnej klasy wektor, który jest iteself model std::vector.

+0

Dzięki talonmies. Ta treść była pomocna w moim przypadku. – Umbrella

+0

Mam jeszcze jedno małe pytanie. Czy można używać cudaMemcpyAsync i jądra bez cudaMallocHost? Próbowałem utworzyć kod asynchroniczny bez konieczności przypinania pamięci hosta, ale to zadziałało. Czy to ogólne czy przypadkowe? – Umbrella

+1

Tak, to zadziała, ale transfery nie będą asynchroniczne na urządzeniu dla żadnego transferu> 64kb. Wywołanie API hosta natychmiast powraca, ale urządzenie jest blokowane do czasu zakończenia kopiowania, tj. nie ma równoczesnego wykonywania jądra i pamięci, ani żadnych innych korzyści z "cudaMemcpyAsync". – talonmies

Powiązane problemy