幾個月來一直在玩這個宏偉的CUDA實驗,我發現自己嘗試了更多,試圖從教程示例中脫離出來。我的問題是這樣的:如果我只想在GPU上使用陣列來做臨時存儲而不將它們複製回主機來顯示/輸出,我可以用__device__ double array[numpoints];
創建一個設備陣列然後對於我想要的任何東西從GPU拿回來,我需要做整個cudaMalloc,cudaMemcpy spiel,對吧?另外,在一種方法或另一種方法之間是否有區別?我以爲他們都在全局內存中創建數組。臨時CUDA設備陣列
0
A
回答
1
請參閱this關於__device__
限定符的說明。因此,如果您聲明__device__
,則無法通過cudaMemcpy
在主機中訪問它,但鏈接中提到了其他信息。
相反,你所能做的就是在主機代碼聲明全局指針(即,沒有__device__
),並使用cudaMalloc
分配。因此您可以使用將結果複製回主機。
1
您可以創建,填寫和使用globl存儲器陣列,而不需要使用cudaMemcpy
將數據從主機進行初始化複製,如果這是你問的。在下面的簡單例子中,我創建了一個全局內存數組,它直接在設備上初始化,然後在不再需要時釋放它。
#include<stdio.h>
__global__ void init_temp_data(float* temp_data) {
temp_data[threadIdx.x] = 3.f;
}
__global__ void copy_global_data(float* temp_data, float* d_data) {
d_data[threadIdx.x] = temp_data[threadIdx.x];
}
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
int main() {
float* data = (float*)malloc(16*sizeof(float));
float* d_data; gpuErrchk(cudaMalloc((void**)&d_data,16*sizeof(float)));
float* temp_data; gpuErrchk(cudaMalloc((void**)&temp_data,16*sizeof(float)));
init_temp_data<<<1,16>>>(temp_data);
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
copy_global_data<<<1,16>>>(temp_data,d_data);
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
gpuErrchk(cudaFree(temp_data));
gpuErrchk(cudaMemcpy(data,d_data,16*sizeof(float),cudaMemcpyDeviceToHost));
for (int i=0; i<16; i++) printf("Element number %i is equal to %f\n",i,data[i]);
getchar();
return 0;
}
相關問題
- 1. 設置臨時陣列
- 2. 臨時陣列
- 3. CUDA-GDB:沒有CUDA設備
- 4. 在將設備陣列從設備傳輸到CUDA中的主機之後無法訪問陣列元素
- 5. 在設備中使用陣列的CUDA並行壓縮
- 6. 複製陣列從主機到設備的CUDA
- 7. 從CUDA主機複製陣列到設備
- 8. CUDA將鋸齒陣列從主機複製到設備
- 9. CUDA設備到設備轉移昂貴
- 10. CUDA比較陣列
- 11. 掃描陣列CUDA
- 12. CUDA 2D陣列nvidia
- 13. 複製到CUDA到設備內存CUDA
- 14. 沒有臨時iOS設備都可以
- 15. 設備中的臨時認證問題?
- 16. CUDA,試圖在設備
- 17. 支持CUDA的設備
- 18. CUDA設備查詢錯誤
- 19. CUDA到設備錯誤
- 20. CUDA設備指針操作
- 21. 設備與CUDA的分裂
- 22. CUDA指針設備常數
- 23. 設備內存刷新cuda
- 24. 如何cudaMemcpy主機值指向一個設備陣列的指針數組Cuda
- 25. Meteor中的陣列臨時存儲
- 26. C + +錯誤:「臨時陣列的地址」
- 27. 無臨時變量格式化陣列
- 28. 獲取CUDA設備中的原始矩陣索引
- 29. 矩陣未在CUDA中成功從設備複製回主機
- 30. 重寫陣列而不第二臨時陣列
cudaMemcpy可以用來複制靜態聲明的__device__內存。這就是'cudaGetSymbolAddress'和'cudaGetSymbolSize'的用途 - 您可以在運行時獲得靜態符號的詳細信息,然後像使用其他主機地址一樣使用它們。 – talonmies
@talonmies:很高興認識這個。剛剛嘗試,它的工作謝謝你。如果你願意回答相同的問題,我會贊成它(看起來這是問題的海報正在尋找的東西)。 –