2014-11-05 3 views
-2

В настоящее время по какой-то причине cudaMalloc устанавливает errno в 17, несмотря на возвращение cudaSuccess. Я прочесываю интернет, но мой google foo не принес мне никакого просветления, поэтому я решил спросить, что стек переполняет людей.cudaMalloc настройка errno, несмотря на возвращение cudaSuccess

Вот мой выход

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 ...... 
} 

Кто-нибудь есть anyidea, что может быть здесь происходит? Сейчас ARRAY_SIZE установлен в 4 миллиона, но тот же самый вопрос появляется, когда он равен 400.

+0

Уверена, что ошибка исходит от CUDA? Для меня похоже, что ошибка исходит со стороны C++ (хост) и не имеет ничего общего с CUDA-Runtime, поскольку CUDA-Runtime даст вам cudaError. – Turing85

+0

Я не уверен, откуда исходит ошибка, если не из cuda. Я не слишком много знаю о том, как работает errno, но что еще может заставить его установить? Могут ли другие процессы быть причиной? – robbert229

+0

Я уверен, что ошибка не исходит из CUDA-Runtime (хотя это может быть вызвано CUDA). – Turing85

ответ

1

Вы, кажется, считаете, что errno должен быть равен нулю, если предыдущая функция не возвратила ошибки.

Это не тот случай.

errno не требуется устанавливать в ноль, если предыдущая функция выполнена успешно.

От linux man page:

Его значение имеет значение только тогда, когда значение возврата вызова указывается

и

функция ошибки что преуспевает, допустимо d изменить errno.

В вашем случае, предыдущая функция (независимо от того, что было, в данном случае, вероятно, cudaMalloc или какой-либо функции, созванном cudaMalloc обычной библиотеки) была успешной. Поэтому содержимое переменной errno не имеет значения.

+0

Спасибо, это очень помогает! – robbert229

Смежные вопросы