2013-04-13 18 views
5

Jak stwierdzono w innych pytaniach i zgodnie z linkiem, nie można już używać nazwy symbolu dla tej funkcji. Skoro funkcja już nie istnieje, czy kiedykolwiek chciałbyś jej użyć ponad cudaMemCpy? Kiedy w ogóle chciałbyś go użyć? Co to jest kompromis lub korzyść?cudaMemcpyToSymbol vs. cudaMemcpy dlaczego wciąż jest w pobliżu (cudaMemcpyToSymbol)

http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group_CUDART_MEMORY_gf268fa2004636b6926fdcd3189152a14.html

Odpowiedz

16

W skrócie, bo cudaMemcpy nie może zrobić to samo, co cudaMemcpyToSymbol bez dodatkowego wezwania API. Rozważmy stałą tablicę pamięci:

__constant__ float coeffs[8]; 

skopiować wartości do tej tablicy przy użyciu cudaMemcpyToSymbol, zrób

cudaMemcpyToSymbol(coeffs, hostData, 8*sizeof(float)); 

Aby zrobić to samo z cudaMemcpy Wymaga to:

float *dcoeffs; 
cudaGetSymbolAddress((void **)&dcoeffs, coeffs); 
cudaMemcpy(dcoeffs, hostData, 8*sizeof(float), cudaMemcpyHostToDevice); 

bezpośrednie wywołanie to cudaMemcpy jest nielegalne bez wcześniejszego wyszukiwania symbolu.

[norma Wsparcie Wszystkie kod napisany w przeglądarce bez dostępu do dokumentacji lub kompilatora użyć na własne ryzyko]

+0

Ty, jaka jest relacja pomiędzy '__constant__' pamięci i wskaźnik typu parametru const w sygnaturze metody . Czy '__constant__' ma wskaźnik do const, ponieważ jest typu? Dlaczego nie możesz po prostu wziąć & coeffs, aby uzyskać adres? – rubixibuc

+2

'__constant__' jest specyfikatorem klasy pamięci w CUDA, który mówi, że symbol znajduje się w specjalnej buforowanej, tylko do odczytu części GPRAM DRAM. Jest całkowicie niezależny od const. Możesz użyć '& coeffs', co oznaczałoby adres symbolu * w pamięci hosta * nie jest to pamięć GPU, co jest tym, czego wymaga wywołanie API – talonmies

+0

Gdzie jest adres wskazywany przez zmienne wskażniki wskaźnika, gdzie byłaby kopia tego pliku adresować pamięć bezpośrednią? Czy dotyczy to również zmiennych zadeklarowanych za pomocą '__device__'? – rubixibuc

Powiązane problemy