定义了如何处理错误:
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__ ))
通常,要将结果存储在类型为double的大小为N的数组d_results中,可以立即在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 vectorresults(N); cudaMemcpy(results.data(),d_results,N*sizeof(double),cudaMemcpyDeviceToHost);
如果第二行失败,因为没有足够的内存来一次存储所有结果.如何设法进行计算并将结果正确传输到主机?是否必须按批次进行计算?我宁愿避免手动批处理.在CUDA中管理这种情况的标准方法是什么?