C++ 尽管返回cudaSuccess,cudaMalloc设置错误否

C++ 尽管返回cudaSuccess,cudaMalloc设置错误否,c++,cuda,runtime-error,gpu,C++,Cuda,Runtime Error,Gpu,目前出于某种原因,Cudamaloc将errno设置为17,尽管返回了一个cudaSuccess。我一直在搜索互联网,但我的谷歌foo并没有给我带来任何启示,所以我决定去问问人们 这是我的输出 ERROR: What is not going down, ERRSTR: Success, ERRNO 0 ERROR: What is going on here?, ERRSTR: File exists, ERRNO 17 这是我的代码(至少有一部分) 有人知道这里发生了什么吗?目前,数组大小

目前出于某种原因,Cudamaloc将errno设置为17,尽管返回了一个cudaSuccess。我一直在搜索互联网,但我的谷歌foo并没有给我带来任何启示,所以我决定去问问人们

这是我的输出

ERROR: What is not going down, ERRSTR: Success, ERRNO 0
ERROR: What is going on here?, ERRSTR: File exists, ERRNO 17
这是我的代码(至少有一部分)


有人知道这里发生了什么吗?目前,数组大小设置为400万,但当它为400时,同样的问题也会出现

如果上一个函数没有返回错误,您似乎假设
errno
必须为零

事实并非如此

如果上一个功能成功,则不需要将
errno
设置为零

从:

仅当调用的返回值指示错误时,其值才有效

成功的函数允许更改errno


在您的例子中,前面的函数(无论它是什么,在本例中可能是
cudamaloc
cudamaloc
库例程调用的某个系统函数)是成功的。因此,
errno
变量的内容不重要。

您确定错误来自CUDA吗?对我来说,错误看起来是来自C++(主机)端,与CUDA运行时无关,因为CUDA运行时会给您一个CUDA错误。如果不是CUDA,我不确定错误是从哪里来的。我不太了解errno是如何工作的,但还有什么能导致它被设置的呢?其他进程可能是原因吗?我很确定,错误不是来自CUDA运行时(尽管它可能是由CUDA引起的)。谢谢,这很有帮助!
//headers
#define CheckError(MESSAGE) do { fprintf(stderr,"ERROR: %s, ERRSTR: %s, ERRNO %i\n",MESSAGE,strerror(errno),errno); } while(0);
#define CudaSafeCall( err ) __cudaSafeCall( err, __FILE__, __LINE__ )
#define ARRAY_LENGTH ( 1000000 )
#define ARRAY_ELEMENT_SIZE ( sizeof(int) )
#define ARRAY_SIZE ( (size_t)ARRAY_ELEMENT_SIZE * ARRAY_LENGTH )

inline void __cudaSafeCall( cudaError err, const char *file, const int line )
{
    if ( cudaSuccess != err )
    {
        fprintf( stderr, "cudaSafeCall() failed at %s:%i : %s\n",
             file, line, cudaGetErrorString( err ) );
        exit( -1 );
    }
    return;
}

int main(int argc,char* argv[])
{
    ..... Other Code ......

    int *device_array;
    CheckError("What is not going on here.");
    CudaSafeCall(cudaMalloc((void**)&device_array,ARRAY_SIZE));
    CheckError("What is going on here?");

    ..... Other Code ......
}