2010-04-12 12 views
14

Tengo una función de búsqueda CUDA que calcula una sola variable. ¿Cómo puedo devolverlo?¿Cómo devolver una sola variable desde una función 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); 

para estas dos líneas me sale este error: error: argumento de tipo "largo" es incompatible con el parámetro de tipo "const void *"

Respuesta

13

Para obtener un resultado único que tiene que memcpy ella, es decir:

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

supongo que venga el error porque estás pasando a un valor de largo, en lugar de un puntero a un valor mucho.

26

He estado usando __device__ las variables para este fin, de esa manera usted no tiene que molestarse con cudaMalloc y cudaFree y usted no tiene que pasar un puntero como un argumento del núcleo, que le ahorra un registro en su kernel para arrancar

__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

¿cómo llega el código de host al tipo de variable de dispositivo? – erogol

+0

@Erogol tanto el núcleo como el código de host conoce el tipo de la declaración '__device__' – wich

+1

Por alguna razón, esto sólo funciona para mí (Toolkit 6.5) si reemplazo' "d_answer" '' con d_answer', es decir, eliminar las citas . Aparte de eso, esto funciona bien. – icurays1

Cuestiones relacionadas