C++ 我可以得到最后一个调用的CUDA API函数的名称吗?
我可以使用C++ 我可以得到最后一个调用的CUDA API函数的名称吗?,c++,reflection,error-handling,cuda,status,C++,Reflection,Error Handling,Cuda,Status,我可以使用cudaGetLastError()获取上一次CUDA API调用的返回状态。取它的名字怎么样?我没有看到一个cudaGetLastAPICallName(),但是有一些(未)记录的等价物吗?据我所知,没有,你不能。重要的是要记住 cudaGetLastError()返回先前运行时API调用的状态,但不一定是最后一个。异步调用在返回cudaSuccess后,可以在操作期间报告错误,在这种情况下,其错误将由下一个返回状态的API函数返回。对于流中的并发操作,解析his的结果可能会变得特别
cudaGetLastError()
获取上一次CUDA API调用的返回状态。取它的名字怎么样?我没有看到一个cudaGetLastAPICallName()
,但是有一些(未)记录的等价物吗?据我所知,没有,你不能。重要的是要记住
cudaGetLastError()
返回先前运行时API调用的状态,但不一定是最后一个。异步调用在返回cudaSuccess
后,可以在操作期间报告错误,在这种情况下,其错误将由下一个返回状态的API函数返回。对于流中的并发操作,解析his的结果可能会变得特别复杂我不清楚如何以提供有意义的额外信息的方式干净地处理这两种情况,特别是当某些类型的设备运行时错误可以杀死活动上下文时,它无论如何会释放很多状态……据我所知,不,你不能。重要的是要记住
cudaGetLastError()
返回先前运行时API调用的状态,但不一定是最后一个。异步调用在返回cudaSuccess
后,可以在操作期间报告错误,在这种情况下,其错误将由下一个返回状态的API函数返回。对于流中的并发操作,解析his的结果可能会变得特别复杂我不清楚如何以提供有意义的额外信息的方式干净地处理这两种情况,特别是当某些类型的设备运行时错误可以杀死活动上下文时,它无论如何会释放很多状态……据我所知,不,你不能。重要的是要记住
cudaGetLastError()
返回先前运行时API调用的状态,但不一定是最后一个。异步调用在返回cudaSuccess
后,可以在操作期间报告错误,在这种情况下,其错误将由下一个返回状态的API函数返回。对于流中的并发操作,解析his的结果可能会变得特别复杂我不清楚如何以提供有意义的额外信息的方式干净地处理这两种情况,特别是当某些类型的设备运行时错误可以杀死活动上下文时,它无论如何会释放很多状态……据我所知,不,你不能。重要的是要记住
cudaGetLastError()
返回先前运行时API调用的状态,但不一定是最后一个。异步调用在返回cudaSuccess
后,可以在操作期间报告错误,在这种情况下,其错误将由下一个返回状态的API函数返回。对于流中的并发操作,解析his的结果可能会变得特别复杂我不清楚如何以能够提供有意义的额外信息的方式干净地处理这两种情况,特别是当某些类型的设备运行时错误可以杀死活动上下文时,不管怎么说,这会释放很多状态….不。您应该将所有CUDA调用封装在一个宏中,该宏会给出文件名和行号。这样,你就很容易找到罪犯 以下是一个例子:
template< typename T >
inline void __checkCudaErrors(T result, char const *const func, const char *const file, int const line)
{
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err)
{
fprintf(stderr, "%s:%i : checkCudaErrors() CUDA error (#%d): %s.\n",
file, line, (int)err, cudaGetErrorString(err));
exit(-1);
}
}
#define CCE(val) __checkCudaErrors( (val), #val, __FILE__, __LINE__ )
// ...
CCE(cudaMalloc(...));
CCE(cuda...);
myKernel...;
CCE(nextCudaCall);
模板
内联无效校验错误(T结果、字符常量*常量函数、常量字符*常量文件、int常量行)
{
cudaError_t err=cudaGetLastError();
如果(cudaSuccess!=错误)
{
fprintf(stderr,“%s:%i:checkCudaErrors()CUDA错误(#%d):%s。\n”,
文件,行,(int)err,cudaGetErrorString(err));
出口(-1);
}
}
#定义CCE(val)uu校验数据错误((val),#val,uuuu文件,uuuu行uu)
// ...
CCE(Cudamaloc(…);
CCE(cuda…);
我的内核。。。;
首席执行官(下一步行动);
否。您应该将所有CUDA调用封装在一个宏中,该宏将提供文件名和行号。这样,你就很容易找到罪犯
以下是一个例子:
template< typename T >
inline void __checkCudaErrors(T result, char const *const func, const char *const file, int const line)
{
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err)
{
fprintf(stderr, "%s:%i : checkCudaErrors() CUDA error (#%d): %s.\n",
file, line, (int)err, cudaGetErrorString(err));
exit(-1);
}
}
#define CCE(val) __checkCudaErrors( (val), #val, __FILE__, __LINE__ )
// ...
CCE(cudaMalloc(...));
CCE(cuda...);
myKernel...;
CCE(nextCudaCall);
模板
内联无效校验错误(T结果、字符常量*常量函数、常量字符*常量文件、int常量行)
{
cudaError_t err=cudaGetLastError();
如果(cudaSuccess!=错误)
{
fprintf(stderr,“%s:%i:checkCudaErrors()CUDA错误(#%d):%s。\n”,
文件,行,(int)err,cudaGetErrorString(err));
出口(-1);
}
}
#定义CCE(val)uu校验数据错误((val),#val,uuuu文件,uuuu行uu)
// ...
CCE(Cudamaloc(…);
CCE(cuda…);
我的内核。。。;
首席执行官(下一步行动);
否。您应该将所有CUDA调用封装在一个宏中,该宏将提供文件名和行号。这样,你就很容易找到罪犯
以下是一个例子:
template< typename T >
inline void __checkCudaErrors(T result, char const *const func, const char *const file, int const line)
{
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err)
{
fprintf(stderr, "%s:%i : checkCudaErrors() CUDA error (#%d): %s.\n",
file, line, (int)err, cudaGetErrorString(err));
exit(-1);
}
}
#define CCE(val) __checkCudaErrors( (val), #val, __FILE__, __LINE__ )
// ...
CCE(cudaMalloc(...));
CCE(cuda...);
myKernel...;
CCE(nextCudaCall);
模板