2010-04-12 11 views
14

Mam funkcję wyszukiwania CUDA, która oblicza jedną zmienną. Jak mogę to zwrócić z powrotem.Jak zwrócić pojedynczą zmienną z funkcji jądra 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); 

dla obu tych liniach dostaję ten błąd: błąd: argument typu „long” jest niezgodna z parametrem typu „const void *”

Odpowiedz

13

aby uzyskać pojedynczy wynik trzeba memcpy to, tj .:

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

Domyślam się, że błąd pochodzi, ponieważ podajesz długą wartość zamiast wskaźnika do długiej wartości.

26

Używam __device__ zmiennych na ten cel, w ten sposób nie trzeba męczyć się z cudaMalloc i cudaFree i nie trzeba przekazać wskaźnik jako argument jądra, który oszczędza swój rejestr w jądro do rozruchu.

__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

w jaki sposób kod hosta osiąga typ zmiennej urządzenia? – erogol

+0

@Erogol zarówno jądro, jak i kod hosta znają typ z deklaracji "__device__" – wich

+1

Z jakiegoś powodu działa to tylko dla mnie (Toolkit 6.5), jeśli zastąpię '" d_answer "' z 'd_answer', tj. Usuń oferty . Poza tym to działa dobrze. – icurays1

Powiązane problemy