CUDAドライバーのバージョンチェックを入れた

This commit is contained in:
lltcggie 2015-06-08 03:34:42 +09:00
parent 75f258aae3
commit cb2b1cfbf8
3 changed files with 77 additions and 5 deletions

View File

@ -35,8 +35,12 @@ const int layer_num = 7;
const int ConvertMode = CV_RGB2YUV;
const int ConvertInverseMode = CV_YUV2RGB;
// 最低限必要なCUDAドライバーのバージョン
const int MinCudaDriverVersion = 6050;
static std::once_flag waifu2x_once_flag;
static std::once_flag waifu2x_cudnn_once_flag;
static std::once_flag waifu2x_cuda_once_flag;
#ifndef CUDA_CHECK_WAIFU2X
#define CUDA_CHECK_WAIFU2X(condition) \
@ -117,6 +121,38 @@ Waifu2x::eWaifu2xcuDNNError Waifu2x::can_use_cuDNN()
return cuDNNFlag;
}
// CUDAが使えるかチェック
Waifu2x::eWaifu2xCudaError Waifu2x::can_use_CUDA()
{
static eWaifu2xCudaError CudaFlag = eWaifu2xCudaError_NotFind;
std::call_once(waifu2x_cuda_once_flag, [&]()
{
int driverVersion = 0;
if (cudaDriverGetVersion(&driverVersion) == cudaSuccess)
{
if (driverVersion > 0)
{
int runtimeVersion;
if (cudaRuntimeGetVersion(&runtimeVersion) == cudaSuccess)
{
if (runtimeVersion >= MinCudaDriverVersion && driverVersion >= runtimeVersion)
CudaFlag = eWaifu2xCudaError_OK;
else
CudaFlag = eWaifu2xCudaError_OldVersion;
}
else
CudaFlag = eWaifu2xCudaError_NotFind;
}
else
CudaFlag = eWaifu2xCudaError_NotFind;
}
else
CudaFlag = eWaifu2xCudaError_NotFind;
});
return CudaFlag;
}
// 画像を読み込んで値を0.0f1.0fの範囲に変換
Waifu2x::eWaifu2xError Waifu2x::LoadImage(cv::Mat &float_image, const std::string &input_file)
{
@ -538,8 +574,10 @@ Waifu2x::eWaifu2xError Waifu2x::init(int argc, char** argv, const std::string &M
if (process == "gpu")
{
if (can_use_CUDA() != eWaifu2xCudaError_OK)
return eWaifu2xError_FailedCudaCheck;
// cuDNNが使えそうならcuDNNを使う
if (can_use_cuDNN() == eWaifu2xcuDNNError_OK)
else if (can_use_cuDNN() == eWaifu2xcuDNNError_OK)
process = "cudnn";
}

View File

@ -30,6 +30,14 @@ public:
eWaifu2xError_FailedParseModelFile,
eWaifu2xError_FailedConstructModel,
eWaifu2xError_FailedProcessCaffe,
eWaifu2xError_FailedCudaCheck,
};
enum eWaifu2xCudaError
{
eWaifu2xCudaError_OK = 0,
eWaifu2xCudaError_NotFind,
eWaifu2xCudaError_OldVersion,
};
enum eWaifu2xcuDNNError
@ -89,6 +97,7 @@ public:
~Waifu2x();
static eWaifu2xcuDNNError can_use_cuDNN();
static eWaifu2xCudaError can_use_CUDA();
// mode: noise or scale or noise_scale or auto_scale
// process: cpu or gpu or cudnn

View File

@ -557,6 +557,20 @@ public:
return;
}
if (process == "gpu" || process == "cudnn")
{
const auto flag = Waifu2x::can_use_CUDA();
switch (flag)
{
case Waifu2x::eWaifu2xCudaError_NotFind:
MessageBox(dh, TEXT("GPUで変換出来ません。\r\nCUDAドライバーがインストールされていない可能性があります。\r\nCUDAドライバーをインストールして下さい。"), TEXT("エラー"), MB_OK | MB_ICONERROR);
return;
case Waifu2x::eWaifu2xCudaError_OldVersion:
MessageBox(dh, TEXT("GPUで変換出来ません。\r\nCUDAドライバーのバージョンが古い可能性があります。\r\nCUDAドライバーを更新して下さい。"), TEXT("エラー"), MB_OK | MB_ICONERROR);
return;
}
}
SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETPOS, 0, 0);
cancelFlag = false;
isLastError = false;
@ -714,19 +728,30 @@ public:
void CheckCUDNN(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData)
{
const auto flag = Waifu2x::can_use_CUDA();
switch (flag)
{
case Waifu2x::eWaifu2xCudaError_NotFind:
MessageBox(dh, TEXT("cuDNNは使えません。\r\nCUDAドライバーがインストールされていない可能性があります。\r\nCUDAドライバーをインストールして下さい。"), TEXT("結果"), MB_OK | MB_ICONERROR);
return;
case Waifu2x::eWaifu2xCudaError_OldVersion:
MessageBox(dh, TEXT("cuDNNは使えません。\r\nCUDAドライバーのバージョンが古い可能性があります。\r\nCUDAドライバーを更新して下さい。"), TEXT("結果"), MB_OK | MB_ICONERROR);
return;
}
switch (Waifu2x::can_use_cuDNN())
{
case Waifu2x::eWaifu2xcuDNNError_OK:
MessageBox(dh, TEXT("cuDNNが使えます"), TEXT("結果"), MB_OK | MB_ICONINFORMATION);
MessageBox(dh, TEXT("cuDNNが使えます"), TEXT("結果"), MB_OK | MB_ICONINFORMATION);
break;
case Waifu2x::eWaifu2xcuDNNError_NotFind:
MessageBox(dh, TEXT("cuDNNは使えません\r\n「cudnn64_65.dll」が見つかりません"), TEXT("結果"), MB_OK | MB_ICONERROR);
MessageBox(dh, TEXT("cuDNNは使えません\r\n「cudnn64_65.dll」が見つかりません"), TEXT("結果"), MB_OK | MB_ICONERROR);
break;
case Waifu2x::eWaifu2xcuDNNError_OldVersion:
MessageBox(dh, TEXT("cuDNNは使えません\r\n「cudnn64_65.dll」のバージョンが古いです。v2を使って下さい。"), TEXT("結果"), MB_OK | MB_ICONERROR);
MessageBox(dh, TEXT("cuDNNは使えません\r\n「cudnn64_65.dll」のバージョンが古いです。v2を使って下さい。"), TEXT("結果"), MB_OK | MB_ICONERROR);
break;
case Waifu2x::eWaifu2xcuDNNError_CannotCreate:
MessageBox(dh, TEXT("cuDNNは使えません\r\ncuDNNを初期化出来ません"), TEXT("結果"), MB_OK | MB_ICONERROR);
MessageBox(dh, TEXT("cuDNNは使えません\r\ncuDNNを初期化出来ません"), TEXT("結果"), MB_OK | MB_ICONERROR);
break;
default:
MessageBox(dh, TEXT("cuDNNÍŽg¦Ü¹ñ"), TEXT("Œ‹‰Ê"), MB_OK | MB_ICONERROR);