C++ mkldnn delopy 多线程推理时候依旧会出现内存泄露
Created by: zhouyongxyz
单线程推理目前内存没有泄露,但是多线程依旧会有。修改depoly 下的代码如下: ` // Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License.
#include "opencv2/core.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/imgproc.hpp" #include #include #include #include #include
#include #include #include
#include <include/config.h> #include <include/ocr_det.h> #include <include/ocr_rec.h> #include #include #include
using namespace std; using namespace cv; using namespace PaddleOCR;
pthread_mutex_t test_mutex;
int main(int argc, char **argv) { if (argc < 3) { std::cerr << "[ERROR] usage: " << argv[0] << " configure_filepath image_path\n"; exit(1); }
Config config(argv[1]);
config.PrintConfigInfo();
std::string img_path(argv[2]);
static cv::Mat srcimg = cv::imread(img_path, cv::IMREAD_COLOR);
static DBDetector det(
config.det_model_dir, config.use_gpu, config.gpu_id, config.gpu_mem,
config.cpu_math_library_num_threads, config.use_mkldnn,
config.use_zero_copy_run, config.max_side_len, config.det_db_thresh,
config.det_db_box_thresh, config.det_db_unclip_ratio, config.visualize);
static CRNNRecognizer rec(config.rec_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.use_zero_copy_run,
config.char_list_file);
pthread_mutex_init(&test_mutex, NULL);
for(static int i=0;i < 10;i++) {
std::thread([](){
std::cout << "Hello from lamda thread " << std::this_thread::get_id() << std::endl;
auto start = std::chrono::system_clock::now();
std::vector<std::vector<std::vector<int>>> boxes;
pthread_mutex_lock(&test_mutex);
det.Run(srcimg, boxes);
rec.Run(boxes, srcimg);
pthread_mutex_unlock(&test_mutex);
auto end = std::chrono::system_clock::now();
auto duration =
std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "i = "<< i << " 花费了"
<< double(duration.count()) *
std::chrono::microseconds::period::num /
std::chrono::microseconds::period::den
<< "秒" << std::endl;
}).detach();
}
while(1);
return 0;
} `
按照官方的c++部署方式编译执行,会发现线程执行完了,内存也没有释放,持续增长。