В настоящее время по какой-то причине cudaMalloc устанавливает errno в 17, несмотря на возврат cudaSuccess. Я искал в интернете, но мой Google Foo не принес мне никакого просветления, поэтому я решил попросить людей переполнить стек.
Вот мой вывод
ERROR: What is not going down, ERRSTR: Success, ERRNO 0
ERROR: What is going on here?, ERRSTR: File exists, ERRNO 17
А вот и мой код (хотя бы часть)
//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 ......
}
Кто-нибудь знает, что здесь происходит? Прямо сейчас ARRAY_SIZE установлен в 4 миллиона, но та же самая проблема обнаруживается, когда это 400.
Вы, кажется, предполагаете, что errno
должен быть равен нулю, если предыдущая функция не вернула ошибку.
Это не вариант.
errno
не требуется устанавливать в ноль, если предыдущая функция была успешной.
Его значение имеет значение только тогда, когда возвращаемое значение вызова указывает на ошибку
а также
функция, которая завершается успешно, может измениться errno.
В вашем случае предыдущая функция (какой бы она ни была, в этом случае, вероятно, cudaMalloc
или какая-то системная функция, вызываемая cudaMalloc
рутина библиотеки) прошла успешно. Поэтому содержание errno
переменные не значимы.