Прежде всего, проверьте, успешно ли выполняются вызовы функций!
cudaDeviceProp prop;
int dev;
if (cudaGetDevice(&dev) != cudaSuccess)
{
/* error */
abort();
}
if (cudaGetDeviceProperties(&prop, dev) != cudaSuccess)
{
/* error */
abort();
}
Я сделал небольшой макрос, который использую для вызова всех функций CUDA, который выполняет проверку и выдает пользовательское исключение:
#define CUDACALL(F, ARGS...) do { e = F(ARGS); if (e != cudaSuccess) throw cudaException(#F, e); } while (false)
С этим, я просто говорю,
try
{
int dev;
cudaDeviceProp prop;
CUDACALL(cudaGetDevice, &dev);
CUDACALL(cudaGetDeviceProperties, &prop, dev);
// ...
}
catch (cudeException const & e)
{
std::cerr << "Cuda error: " << e.what() << "\n";
}
Класс исключения определяется следующим образом:
struct cudaException : public std::exception
{
cudaException(const std::string & str, cudaError_t err) : s(str), e(err) { }
~cudaException() throw() { }
virtual const char * what() const throw()
{
const std::string r = s + ": \"" + cudaGetErrorString(e) + "\" (" + (char)(e + '0') + ')';
return r.c_str();
}
private:
std::string s;
cudaError_t e;
};