2010-04-12 10 views
14

Ho una funzione di ricerca CUDA che calcola una singola variabile. Come posso restituirlo.Come restituire una singola variabile da una funzione del kernel CUDA?

__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); 

per entrambe queste linee ottengo questo errore: errore: argomento di tipo "lungo" è incompatibile con il parametro di tipo "const void *"

risposta

13

Per ottenere un unico risultato si deve memcpy esso, vale a dire:

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

Credo che l'errore venire perché si sta passando un lungo di valore, invece di un puntatore a un valore long.

26

Sto usando __device__ variabili per questo scopo, in questo modo non c'è bisogno di perdere tempo con cudaMalloc e cudaFree e non si deve passare un puntatore come argomento del kernel, che consente di risparmiare un registro nel vostro kernel da avviare.

__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

in che modo il codice host raggiunge il tipo di variabile dispositivo? – erogol

+0

@Erogol sia il kernel che il codice host conoscono il tipo dalla dichiarazione '__device__' – wich

+1

Per qualche ragione, questo funziona solo per me (Toolkit 6.5) se sostituisco' "d_answer" 'con' d_answer', cioè rimuovi le quotazioni . Oltre a questo, questo funziona bene. – icurays1

Problemi correlati