2012-11-14 14 views
8

Od online dokumentacji:cudaMemset() - czy ustawia bajty lub liczby całkowite?

cudaError_t cudaMemset (void * devPtr, int value, size_t count) 

wypełnia pierwsze bajtów count obszaru pamięci wskazywanego przez devPtr ze stałą bajt wartości wartości.

Parametry: devPtr - wskaźnik do pamięci urządzenia wartość - wartość ustawić dla każdego bajt o określonej pamięci Count - rozmiar w bajtachustawić

Opis ten nie wydaje się być poprawne jako:

int *dJunk; 
cudaMalloc((void**)&dJunk, 32*(sizeof(int)); 
cudaMemset(dJunk, 0x12, 32); 

ustawi wszystkie 32 liczby całkowite na 0x12, a nie 0x12121212. (Int vs. Byte)

Opis mówi o ustawianiu bajtów. Liczba i wartość są opisane w kategoriach bajtów. Liczba powiadomień jest typu size_t, a wartość jest typu int. tj. Ustaw rozmiar bajtu na wartość typu int.

cudaMemset() nie jest wymienione w przewodniku prog. Muszę założyć, że zachowanie, które widzę, jest poprawne, a dokumentacja jest zła.

Czy istnieje lepsze źródło dokumentacji? (Gdzie?)
Czy są obsługiwane inne typy? to może zadziała float *dJunk;? Inni?

Odpowiedz

13

Dokumentacja jest poprawna, a Twoja interpretacja tego, co zrobiła cudaMemset jest nieprawidłowa. Funkcja naprawdę ustawia wartości bajtów. Twój przykład ustawia pierwsze 32 bajtówdo 0x12 nie wszystkie 32 liczb całkowitych do 0x12, a mianowicie:

#include <cstdio> 

int main(void) 
{ 
    const int n = 32; 
    const size_t sz = size_t(n) * sizeof(int); 
    int *dJunk; 
    cudaMalloc((void**)&dJunk, sz); 
    cudaMemset(dJunk, 0, sz); 
    cudaMemset(dJunk, 0x12, 32); 

    int *Junk = new int[n]; 

    cudaMemcpy(Junk, dJunk, sz, cudaMemcpyDeviceToHost); 

    for(int i=0; i<n; i++) { 
     fprintf(stdout, "%d %x\n", i, Junk[i]); 
    } 

    cudaDeviceReset(); 
    return 0; 
} 

produkuje

$ nvcc memset.cu 
$ ./a.out 

0 12121212 
1 12121212 
2 12121212 
3 12121212 
4 12121212 
5 12121212 
6 12121212 
7 12121212 
8 0 
9 0 
10 0 
11 0 
12 0 
13 0 
14 0 
15 0 
16 0 
17 0 
18 0 
19 0 
20 0 
21 0 
22 0 
23 0 
24 0 
25 0 
26 0 
27 0 
28 0 
29 0 
30 0 
31 0 

tj. wszystkie 128 bajtów ustawione na 0, a następnie pierwsze 32 bajty ustawione na 0x12. Dokładnie tak, jak opisano w dokumentacji.

+0

Tak, niepoprawnie patrzyłem na moje wyniki. Spróbuj zmienić cudaMemset (dJunk, 0x12, 32); do cudaMemset (dJunk, 0x1234, 32); Wygląda na to, że cudaError_t cudaMemset (void * devPtr, int value, size_t count) powinno być: cudaError_t cudaMemset (void * devPtr, char value, size_t count) tj. VALUE ma rozmiar bajtu. Używanie rozmiaru int jest nieco mylące. (Tylko to wskazuję.) – Doug

+0

@Doug: Wciąż nie jestem pewien, o co ci chodzi. Dokumentacja, którą cytujesz w swoim pytaniu, wyraźnie mówi, że "wartość" jest traktowana jako wartość bajtu. Funkcja zachowuje się identycznie ze standardowym memem C, jedyną różnicą jest to, że wartość bajtu jest przekazywana w LSB słowa 32-bitowego. Nawiasem mówiąc, istnieje prawdziwa 32-bitowa funkcja memset w interfejsie API sterownika, jeśli tego właśnie szukasz. – talonmies