4
在定義瞭如何處理錯誤:正確處理大於GPU可用內存的結果數組?
static void HandleError(cudaError_t err,
const char *file,
int line) {
if (err != cudaSuccess) {
printf("%s in %s at line %d\n", cudaGetErrorString(err),
file, line);
exit(EXIT_FAILURE);
}
}
#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__))
通常情況下,存儲在陣列d_results我們的結果,double類型,大小爲N,可在GPU內存在一次分配中,我們可以管理將數據從設備傳輸到主機,如下所示:
double *d_results;
HANDLE_ERROR(cudaMalloc(&d_results,N*sizeof(double)));
//Launch our kernel to do some computations and store the results in d_results
.....
// and transfer our data from the device to the host
vector<double> results(N);
cudaMemcpy(results.data(),d_results,N*sizeof(double),cudaMemcpyDeviceToHost);
如果第二行因爲沒有足夠的內存一次存儲所有結果而失敗。我如何設法進行計算並將結果正確傳輸到主機?是否必須按批次進行計算?我寧願避免手動配料。在CUDA中管理這種情況的標準方法是什麼?
手動配料可能是最好的選擇。唯一的其他常規選項是在CUDA中使用主機映射內存,也稱爲零拷貝內存。這允許主機內存直接映射到GPU的內存空間,並像GPU全局內存那樣訪問。但是對於通用訪問來說,它通常很慢。 –