Search
Duplicate

TensorRT C++/ NVIDIA Sample 소스를 프로젝트에 추가 하기

TensorRT를 사용하는 코드를 공식 가이드를 참조하여 직접 작성할 수도 있으나, 여러 가지 공통적으로 쓰이는 코드들은 NVIDIA의 Sample 소스를 참조하면 편하다. —물론 직접 하는 것도 할 것이다.
우선 아래의 NVIDIA의 TensorRT Git을 내려 받자.
TensorRT
NVIDIA
이 소스 중에 TensorRT를 이용한 샘플은 Samples 폴더 하위에 있다.
기본적으로 하나의 모델에 대해 하나의 클래스 형태로 소스가 구성되어 있고, 각 클래스에서 공통적으로 사용하는 코드는 common 폴더에 모아져 있다.
common에는 TensorRT에서 공통적으로 사용되는 기능들이 모아져 있으므로 이 폴더의 소스를 프로젝트에 추가하면 된다.
이 폴더 내의 소스들을 모두 자신의 프로젝트에 추가하자. 이때 소스 내의 python 소스는 불필요하므로 삭제하고, 폴더 내의 windows 폴더도 불필요하므로 폴더채 삭제하고 나머지 소스만 프로젝트에 추가한다.
파일을 추가한 후에 현재 사용하고 있는 Visual Studio의 C++ 버전에 따라 —필자는 C++ 17— 에러가 출력될 수 있다. 작성된 Sample의 코드가 예전 코드이기 때문인데, 최신 버전에 맞게 코드만 바꾸면 문제 없이 사용할 수 있다.
getenv가 안전하지 않으므로 _dupenv_s를 사용하라는 부분은 해당 에러가 나는 코드를 아래를 참고하여 바꿔 준다.
inline bool isDebug() { char* value = NULL; size_t len = NULL; errno_t err = _dupenv_s(&value, &len, "TENSORRT_DEBUG"); free(value); return err; // 원본 코드를 위의 코드로 바꾼다. //return (std::getenv("TENSORRT_DEBUG") ? true : false); }
C++
복사
LPCWSTR로 바꾸는 에러는 아래 참조
inline void loadLibrary(const std::string& path) { #ifdef _MSC_VER void* handle = LoadLibrary((LPCWSTR)path.c_str()); // 원본 코드를 위의 코드로 바꾼다. //void* handle = LoadLibrary(path.c_str()); // 이하 생략 }
C++
복사
localtimelocaltime_s로 바꾸라는 에러는 아래 참조
void putOutput() { if (mShouldLog) { // prepend timestamp std::time_t timestamp = std::time(nullptr); tm tm_local; localtime_s(&tm_local, &timestamp); // 원본 코드를 위의 코드로 수정 //tm* tm_local = std::localtime(&timestamp); mOutput << "["; mOutput << std::setw(2) << std::setfill('0') << 1 + tm_local.tm_mon << "/"; mOutput << std::setw(2) << std::setfill('0') << tm_local.tm_mday << "/"; mOutput << std::setw(4) << std::setfill('0') << 1900 + tm_local.tm_year << "-"; mOutput << std::setw(2) << std::setfill('0') << tm_local.tm_hour << ":"; mOutput << std::setw(2) << std::setfill('0') << tm_local.tm_min << ":"; mOutput << std::setw(2) << std::setfill('0') << tm_local.tm_sec << "] "; // 원본 코드를 위의 코드로 수정 - 포인터가 구조체로 바뀌어서 변경된 코드 //mOutput << std::setw(2) << std::setfill('0') << 1 + tm_local->tm_mon << "/"; //mOutput << std::setw(2) << std::setfill('0') << tm_local->tm_mday << "/"; //mOutput << std::setw(4) << std::setfill('0') << 1900 + tm_local->tm_year << "-"; //mOutput << std::setw(2) << std::setfill('0') << tm_local->tm_hour << ":"; //mOutput << std::setw(2) << std::setfill('0') << tm_local->tm_min << ":"; //mOutput << std::setw(2) << std::setfill('0') << tm_local->tm_sec << "] "; // std::stringbuf::str() gets the string contents of the buffer // insert the buffer contents pre-appended by the appropriate prefix into the stream mOutput << mPrefix << str(); } // 이하 생략 }
C++
복사

참조 자료