2010-04-12 4 views
14

J'ai une fonction de recherche CUDA qui calcule une seule variable. Comment puis-je le retourner.Comment retourner une seule variable à partir d'une fonction noyau 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); 

pour ces deux lignes je reçois cette erreur: erreur: argument de type « long » est incompatible avec le paramètre de type « const void * »

Répondre

13

Pour obtenir un seul résultat que vous devez Memcpy il, à savoir:

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

Je suppose que l'erreur vient parce que vous passez une valeur à long, au lieu d'un pointeur vers une valeur à long.

26

J'utilise __device__ des variables à cet effet, de cette façon vous n'avez pas à se soucier de cudaMalloc et cudaFree et vous ne devez pas passer un pointeur comme argument du noyau, qui vous permet d'économiser un registre dans votre noyau pour démarrer.

__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

Comment le code hôte atteint-il le type de variable de périphérique? – erogol

+0

@Erogol le noyau et le code hôte connaissent le type de la déclaration '__device__' – wich

+1

Pour une raison quelconque, cela ne fonctionne que pour moi (Toolkit 6.5) si je remplace' "d_answer" 'par' d_answer', c'est-à-dire supprimer les citations . A part ça, cela fonctionne bien. – icurays1

Questions connexes