2012-11-14 21 views
8

Von online Dokumentation:cudaMemset() - setzt es Bytes oder ganze Zahlen?

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

Füllt die erste Zählung Bytes des Speicherbereichs durch devPtr mit dem konstanten Byte Wert Wert darauf.

Parameter: devPtr - Zeiger auf Gerätespeicher Wert - Wert für jedes Byte von spezifizierten Speicher Zahl einstellen - in Bytes Größe

Diese Beschreibung korrekt zu sein scheint nicht gesetzt wie:

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

werden alle 32 Ganzzahlen auf 0x12, nicht 0x12121212 gesetzt. (Int vs Byte)

Die Beschreibung bezieht sich auf das Setzen von Bytes. Count und Value werden in Bytes beschrieben. Die Anzahl der Benachrichtigungen ist vom Typ size_t und der Wert ist vom Typ int. d. Setzen Sie eine Byte-Größe auf einen int-Wert.

cudaMemset() wird in der Prog-Anleitung nicht erwähnt. Ich muss annehmen, dass das Verhalten, das ich sehe, korrekt ist, und die Dokumentation ist schlecht.

Gibt es eine bessere Dokumentationsquelle? (Wo?)
Werden andere Typen unterstützt? würde float *dJunk; funktionieren? Andere?

Antwort

13

Die Dokumentation ist korrekt, und Ihre Interpretation dessen, was cudaMemset tut, ist falsch. Die Funktion setzt wirklich Byte-Werte. Ihr Beispiel setzt die ersten 32 Bytes -0x12, nicht alle 32 Zahlen zu 0x12, nämlich:

#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; 
} 

produziert

$ 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 

dh. alle 128 Bytes werden auf 0 gesetzt, dann werden die ersten 32 Bytes auf 0x12 gesetzt. Genau wie in der Dokumentation beschrieben.

+0

Ja, ich habe meine Ergebnisse falsch angesehen. Ändern Sie cudaMemset (dJunk, 0x12, 32); zu cudaMemset (dJunk, 0x1234, 32); Es erscheint cudaError_t cudaMemset (void * devPtr, int-Wert, size_t count) sollte sein: cudaError_t cudaMemset (void * devPtr, char-Wert, size_t count), d. H. VALUE ist vom Size-Byte. Es ist ein bisschen irreführend, Größe int zu verwenden. (Ich zeige das einfach.) – Doug

+0

@Doug: Ich bin mir immer noch nicht sicher, was dein Standpunkt ist. Die Dokumentation, die Sie in Ihrer Frage angeben, besagt eindeutig, dass "Wert" als ein Byte-Wert behandelt wird. Die Funktion verhält sich genau wie das Standard-C-memset, der einzige Unterschied besteht darin, dass der Byte-Wert im LSB eines 32-Bit-Wortes übergeben wird. Übrigens gibt es in der Treiber-API eine echte 32-Bit-Memset-Funktion, wenn Sie das wirklich suchen. – talonmies

Verwandte Themen