MultiThread.h
Go to the source code of this file.
ExampleMultiThreadMultiModels.cpp 예제에 대해 설명합니다.
본 예제는 다중 스레드에서 여러 모델을 사용하는 예제에 대해 설명합니다. 다중 스레드는 여러 작업을 동시에 처리하기 위해서 사용하는 방법입니다. SAIGE VISION의 Runtime 검사 기능의 경우에는 항상 thread-safe하지 않습니다. 따라서 적절한 방법으로 다중 스레드를 사용해야 합니다.
Note
중요: 하나의 thread는 하나의 SAIGE VISION 핸들을 사용해야 합니다.
검사 핸들의 경우 thread-safe하지 않습니다. 여러 thread에서 하나의 핸들을 사용하면 예상치 못한 결과가 발생할 수 있습니다. 따라서, 각각의 worker thread 끼리는 서로 다른 검사 핸들을 사용해야 합니다.
본 예제에서는 사용할 각 핸들에서 사용할 모델의 목록을 작성하는 것으로 시작합니다. 예제에서는 모든 핸들이 동일한 모델 파일을 사용합니다.
| // ExampleMultiThreadMultiModels.cpp:45
std::string dataDir =
get_env_var("SAIGE_HOME") + "/" + get_runtime_base() + "/engine/Examples/data/sfaw2023/images/test/";
// 사용할 모델 목록
std::vector<std::string> modelPathList = {dataDir + "../../models/seg_example.saigeseg",
dataDir + "../../models/seg_example.saigeseg"};
|
그런 다음 사용할 핸들 변수를 선언하고, 각 핸들을 생성해줍니다. 여기서는 worker thread에서 한 번에 하나의 이미지를 검사하여 각 thread마다 결과 핸들을 하나씩 사용합니다.
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 | // ExampleMultiThreadMultiModels.cpp:86
std::vector<SaigeInferenceHandle> handles(modelPathList.size(), nullptr);
std::vector<SaigeInferenceResult> results(modelPathList.size(), nullptr);
/***********************************************************
* 1. 모델 파일 및 검사 결과 핸들 생성,
* Create handles for model files and inference results
***********************************************************/
for (size_t i = 0; i < handles.size(); ++i) {
SaigeHandleConfig config;
config.inspectionSizeHeight = 2496;
config.inspectionSizeWidth = 2496;
unsigned int handleFlags = SAIGE_SET_INSPECTION_SIZE;
if (optimize) {
handleFlags |= SAIGE_OPTIMIZE_HANDLE;
}
retval = SaigeCreateInferenceHandle(&handles[i], kProjectTypeSEG, modelPathList[i].c_str(),
deviceIndex, &config, handleFlags);
if (retval < 0) {
std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval)
<< std::endl;
return retval;
}
retval = SaigeCreateInferenceResult(&results[i]);
if (retval < 0) {
std::cerr << "SaigeCreateInferenceResult failed - " << SaigeStrError(retval)
<< std::endl;
return retval;
}
}
|
본 예제에서는 C++11에서부터 사용 가능한 std::thread 및 lambda 함수를 사용하여 각 worker thread의 job을 정의했습니다. Job의 내용은 다른 예제와 유사합니다.
311
312
313
314
315
316
317
318 | // ExampleMultiThreadMultiModels.cpp:313
std::vector<std::thread> threads{};
for (size_t i = 0; i < handles.size(); ++i) {
threads.push_back(std::thread([verbosity, detailedTime, overlayAlpha, waitkeyMilliSecond,
imagePaths, handle = handles[i], result = results[i],
modelInfo = &modelInfos[i], modelNum = i] {
|
모든 thread를 join 하여 모두 실행되기를 기다리고 종료합니다.
| // ExampleMultiThreadMultiModels.cpp:477
for (auto& th : threads) {
th.join();
}
|