2010-04-12 1 views
14

Ich habe eine CUDA Suchfunktion, die eine einzelne Variable berechnet. Wie kann ich es zurückgeben?Wie kann man eine einzelne Variable aus einer CUDA-Kernelfunktion zurückgeben?

__global__ 
void G_SearchByNameID(node* Node, long nodeCount, long start,char* dest, long answer){ 
    answer = 2; 
} 

cudaMemcpy(h_answer, d_answer, sizeof(long), cudaMemcpyDeviceToHost); 
cudaFree(d_answer); 

für diese beiden Zeilen bekomme ich diesen Fehler: Fehler: Argument vom Typ „long“ ist nicht kompatibel mit dem Parameter des Typs „const void *“

Antwort

13

Um ein einzelnes Ergebnis zu erhalten müssen Sie Memcpy es, das heißt:

#include <assert.h> 

__global__ void g_singleAnswer(long* answer){ *answer = 2; } 

int main(){ 

    long h_answer; 
    long* d_answer; 
    cudaMalloc(&d_answer, sizeof(long)); 
    g_singleAnswer<<<1,1>>>(d_answer); 
    cudaMemcpy(&h_answer, d_answer, sizeof(long), cudaMemcpyDeviceToHost); 
    cudaFree(d_answer); 
    assert(h_answer == 2); 
    return 0; 
} 

ich denke, der Fehler kommen, weil Sie einen langen Wert sind vorbei, anstelle eines Zeigers auf einen langen Wert.

26

Ich habe __device__ Variablen für diesen Zweck wurde verwenden, auf diese Weise müssen Sie müssen nicht die Mühe mit cudaMalloc und cudaFree und Sie keinen Zeiger als Kernel-Argument übergeben, die Sie in ein Register speichert Ihre Kernel zum Booten.

__device__ long d_answer; 

__global__ void G_SearchByNameID() { 
    d_answer = 2; 
} 

int main() { 
    SearchByNameID<<<1,1>>>(); 
    typeof(d_answer) answer; 
    cudaMemcpyFromSymbol(&answer, "d_answer", sizeof(answer), 0, cudaMemcpyDeviceToHost); 
    printf("answer: %d\n", answer); 
    return 0; 
} 
+0

Wie erreicht der Hostcode den Typ der Gerätevariable? – erogol

+0

@Erogol sowohl der Kernel als auch der Host-Code kennen den Typ aus der '__device__' Deklaration – wich

+1

Aus irgendeinem Grund funktioniert das nur für mich (Toolkit 6.5), wenn ich' "d_answer" 'durch' d_answer' ersetze, dh die Angebote entfernen . Ansonsten funktioniert das gut. – icurays1