【问题标题】:How error handling is done in Jcuda?在 Jcuda 中如何进行错误处理?
【发布时间】:2014-11-26 13:23:17
【问题描述】:

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

【问题讨论】:

    标签: cuda jcuda


    【解决方案1】:

    首先,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 方法的开头启用异常检查。我建议至少在开发阶段也这样做。一旦明确程序不包含任何错误,就可以禁用异常,但几乎没有理由这样做:它们方便地提供有关发生哪个错误的清晰信息,否则,调用可能会静默失败。

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多