2016-05-24 66 views
0

可以說我malloc一些結構在內核中,我執行了一些計算。然後我想返回這些變量,但是當我初始化內核時,它們並沒有作爲指針發送,所以如果我想返回這些值。我會怎麼做呢?下面的示例代碼。我如何有效地返回內核malloc數據回到CPU

我只是問這是一個普遍的問題,不解決下面的代碼。我遇到過其他問題,我不知道怎麼去解決這個問題。我明白,你可以拋出一個指針並將結果複製到它上面。然而,如果結果的大小不是預先確定的,那麼這將非常困難。所以我在問是否有更好的方法。

__global__ void addKernel() 
{ 
    int* c = (int*)malloc(sizeof(int) * 32); 
#pragma unroll 
    for (int i = 0; i < 32; i++){ 
     c[i] += 1; 
    } 
} 

回答

2

指針使用設備側分配(newmalloc,或cudaMalloc)不能由主機側的API調用被用於分配。因此,傳輸設備運行時分配的內存中存儲的數據的唯一方法是將其在內核中複製到主機分配的內存中,並傳遞給正在運行的內核。

設備運行時支持設備到設備存儲器副本的memcpycudaMemcpyAsync。我懷疑這將是你在這種情況下的最佳選擇。您應仔細研究文檔this section,以便了解設備運行時API的侷限性。

+0

我已經閱讀過這個部分,但並沒有準備好放棄這個想法:)我正在考慮使用uva和一個標題來指示數據是否被gpu和cpu操縱繼續掃描位置。這是個好主意嗎?如果你想讓我把代碼寫出來,我會在家以後做。 –

+0

我想你應該提供一些關於你正試圖解決的問題的更多信息。有許多不同的策略可以用來處理輸出可變數據量的內核,您通常不需要設備端malloc。 –