如何在Jcuda中完成错误处理?

时间:2014-08-08 05:22:13

标签: cuda jcuda

在CUDA中,我们可以通过检查cudaMemcpy(),cudaMalloc()等函数的返回类型来了解错误,这些函数是使用cudaSuccess的cudaError_t。 JCuda中是否有任何方法可以检查cuMemcpyHtoD(),cuMemAlloc(),cuLaunchKernel()等函数的错误。

1 个答案:

答案 0 :(得分:3)

首先,JCuda(应该)的方法与相应的CUDA函数完全相同:它们以int的形式返回错误代码。这些错误代码也在......

中定义

与相应的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时调用将为JCublas.setExceptionsEnabled(true)

samples通常会在main方法的开头启用异常检查。而且我建议也这样做,至少在开发阶段。一旦显然该程序不包含任何错误,就可以禁用异常,但几乎没有理由这样做:它们可以方便地提供有关发生错误的明确信息,否则,调用可能无声地失败。