在 CUDA 中,我们可以通过检查 cudaMemcpy()、cudaMalloc() 等函数的返回类型来了解错误,即 cudaError_t 和 cudaSuccess。JCuda 中是否有任何方法可以检查 cuMemcpyHtoD()、cuMemAlloc()、cuLaunchKernel() 等函数的错误?
1 回答
首先,JCuda的方法(应该)的行为与相应的 CUDA 函数完全一样:它们以int
. 这些错误代码也定义在...
- Runtime API的cudaError类
- Driver API的CUresult类
- JCublas的cublasStatus类
- JCufft的cufftResult类
- JCurand的curandStatus类
- JCusparse的cusparseStatus类
并且与相应的 CUDA 库中的错误代码相同。
所有这些类还有一个名为的静态方法stringFor(int)
- 例如,cudaError#stringFor(int)和CUresult#stringFor(int)。这些方法返回错误代码的人类可读String
表示。
因此,您可以进行手动错误检查,例如,如下所示:
int error = someCudaFunction();
if (error != 0= {
System.out.println("Error code "+error+": "+cudaError.stringFor(error));
}
这可能会打印出类似的东西
Error code 10: cudaErrorInvalidDevice
但...
...错误检查可能很麻烦。您可能已经在 CUDA 示例中注意到 NVIDIA 引入了一些简化错误检查的宏。同样,我为 JCuda 添加了可选的异常检查:所有库都提供了一个名为setExceptionsEnabled(boolean)
. 打电话时
JCudaDriver.setExceptionsEnabled(true);
那么 Driver API 的所有后续方法调用都会自动检查方法返回值,并CudaException
在有任何错误时抛出一个。
(请注意,此方法对所有库单独存在。例如,JCublas.setExceptionsEnabled(true)
在使用 JCublas 时调用)
示例通常在方法开始时启用异常检查main
。我建议至少在开发阶段也这样做。一旦明确程序不包含任何错误,就可以禁用异常,但几乎没有理由这样做:它们方便地提供有关发生哪个错误的清晰信息,否则,调用可能会静默失败。