2010-04-12 134 views
14

我有一個CUDA搜索功能,可以計算一個單一的變量。我怎樣才能將它歸還。如何從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); 

對於這兩個行我得到這個錯誤: 錯誤:類型「長」的說法是有類型的「常量無效*」

回答

13

爲了得到一個結果的參數不符,你必須的memcpy它,即︰

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

我想錯誤來,因爲你傳遞一個長的值,而不是一個長指針指針。

26

我一直在使用__device__變量爲此目的而,這樣你沒有與cudaMalloccudaFree打擾,你不必傳遞一個指針作爲內核參數,從而節省了您在註冊內核啓動。

__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

主機代碼如何達到設備變量的類型? – erogol 2013-03-06 16:59:02

+0

@Erogol內核和主機代碼都知道'__device__'聲明中的類型 – wich 2013-03-08 23:48:37

+1

由於某種原因,如果我用'd_answer'替換''d_answer''',這隻適用於我(Toolkit 6.5),即刪除引用。除此之外,這個效果很好。 – icurays1 2015-05-26 07:41:41