Commit 03c072bf138490e46309e86f5ec22f36990e4fb3
1 parent
7c5cf8c9
修复显存泄露。特别注意VpcUtils::release()中 acldvppDestroyChannel 需要 aclrtSetCurrentContext 才会生效
Showing
5 changed files
with
50 additions
and
109 deletions
src/decoder/dvpp/DvppStreamDecoder.cpp
... | ... | @@ -67,13 +67,7 @@ bool DvppStreamDecoder::Init(FFDecConfig cfg) { |
67 | 67 | m_deviceId = atoi(cfg.gpuid.c_str()); |
68 | 68 | |
69 | 69 | do{ |
70 | - aclError ret = aclrtSetDevice(m_deviceId); | |
71 | - if(ret != ACL_ERROR_NONE){ | |
72 | - LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); | |
73 | - return false; | |
74 | - } | |
75 | - | |
76 | - ret = aclrtCreateContext(&m_context, m_deviceId); | |
70 | + aclError ret = aclrtCreateContext(&m_context, m_deviceId); | |
77 | 71 | if (ret != ACL_ERROR_NONE) { |
78 | 72 | LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); |
79 | 73 | return false; |
... | ... | @@ -138,15 +132,8 @@ int DvppStreamDecoder::getVdecType(int videoType) |
138 | 132 | |
139 | 133 | void DvppStreamDecoder::doProcessReport(){ |
140 | 134 | |
141 | - aclError ret = aclrtSetDevice(m_deviceId); | |
142 | - if(ret != ACL_ERROR_NONE){ | |
143 | - // cout << "aclrtSetDevice failed" << endl; | |
144 | - LOG_ERROR("aclrtSetDevice failed !"); | |
145 | - return ; | |
146 | - } | |
147 | - | |
148 | 135 | aclrtContext ctx; |
149 | - ret = aclrtCreateContext(&ctx, m_deviceId); | |
136 | + aclError ret = aclrtCreateContext(&ctx, m_deviceId); | |
150 | 137 | if (ret != ACL_ERROR_NONE) { |
151 | 138 | // cout << "aclrtCreateContext failed " << endl; |
152 | 139 | LOG_ERROR("aclrtCreateContext failed !"); | ... | ... |
src/decoder/dvpp/VpcUtils.cpp
... | ... | @@ -17,30 +17,23 @@ VpcUtils::VpcUtils(){ |
17 | 17 | } |
18 | 18 | |
19 | 19 | VpcUtils::~VpcUtils(){ |
20 | - if(context_){ | |
21 | - aclrtDestroyContext(context_); | |
22 | - } | |
23 | - | |
24 | - if (dvppChannelDesc_) { | |
25 | - (void)acldvppDestroyChannel(dvppChannelDesc_); | |
26 | - (void)acldvppDestroyChannelDesc(dvppChannelDesc_); | |
27 | - dvppChannelDesc_ = nullptr; | |
28 | - } | |
20 | + release(); | |
29 | 21 | } |
30 | 22 | |
31 | 23 | int VpcUtils::init(int devId){ |
32 | 24 | |
33 | 25 | m_devId = devId; |
34 | 26 | |
35 | - aclrtCreateContext(&context_, m_devId); | |
36 | - | |
37 | - CHECK_AND_RETURN(aclrtSetCurrentContext(context_), "aclrtSetCurrentContext failed"); | |
38 | - | |
39 | - dvppChannelDesc_ = acldvppCreateChannelDesc(); | |
27 | + aclError ret = aclrtCreateContext(&context_, m_devId); | |
28 | + if (ret != ACL_ERROR_NONE) { | |
29 | + LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); | |
30 | + return false; | |
31 | + } | |
40 | 32 | |
41 | - int ret = ACL_ERROR_NONE; | |
42 | 33 | do |
43 | 34 | { |
35 | + dvppChannelDesc_ = acldvppCreateChannelDesc(); | |
36 | + | |
44 | 37 | ret = acldvppCreateChannel(dvppChannelDesc_); |
45 | 38 | CHECK_AND_BREAK(ret, "acldvppCreateChannel failed !"); |
46 | 39 | |
... | ... | @@ -51,6 +44,21 @@ int VpcUtils::init(int devId){ |
51 | 44 | return ret; |
52 | 45 | } |
53 | 46 | |
47 | +void VpcUtils::release() { | |
48 | + | |
49 | + if(context_){ | |
50 | + aclrtSetCurrentContext(context_); | |
51 | + | |
52 | + if (dvppChannelDesc_) { | |
53 | + (void)acldvppDestroyChannel(dvppChannelDesc_); | |
54 | + (void)acldvppDestroyChannelDesc(dvppChannelDesc_); | |
55 | + dvppChannelDesc_ = nullptr; | |
56 | + } | |
57 | + | |
58 | + aclrtDestroyContext(context_); | |
59 | + } | |
60 | +} | |
61 | + | |
54 | 62 | DvppDataMemory* VpcUtils::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, int out_height, bool key_frame){ |
55 | 63 | |
56 | 64 | aclrtSetCurrentContext(context_); | ... | ... |
src/decoder/dvpp/VpcUtils.h
... | ... | @@ -13,7 +13,8 @@ public: |
13 | 13 | DvppDataMemory* convert2bgr(DvppDataMemory* inMem); |
14 | 14 | |
15 | 15 | DvppDataMemory* resize(acldvppPicDesc *inputDesc_, int out_width, int out_height); |
16 | - | |
16 | +private: | |
17 | + void release(); | |
17 | 18 | private: |
18 | 19 | aclrtContext context_{nullptr}; |
19 | 20 | int m_devId; | ... | ... |
src/decoder/interface/Makefile deleted
1 | -# 各项目录 | |
2 | -LIB_DIR:=$(BUILD_DIR)/$(MODULE)/lib | |
3 | -DEP_DIR:=$(BUILD_DIR)/$(MODULE)/.dep | |
4 | -OBJ_DIR:=$(BUILD_DIR)/$(MODULE)/obj | |
5 | -SRC_DIR:=$(TOP_DIR)/$(MODULE) | |
6 | - | |
7 | -# 源文件以及中间目标文件和依赖文件 | |
8 | -SRCS:=$(notdir $(wildcard $(SRC_DIR)/*.cpp)) | |
9 | -OBJS:=$(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS))) | |
10 | -DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS))) | |
11 | - | |
12 | -# 自动生成头文件依赖选项 | |
13 | -DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d | |
14 | - | |
15 | -JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export | |
16 | - | |
17 | -INCLUDE= -I $(TOP_DIR)/common/inc \ | |
18 | - -I $(TOP_DIR)/common/UtilNPP \ | |
19 | - -I $(TOP_DIR)/ \ | |
20 | - -I $(JRTP_ROOT)/jrtplib/include/jrtplib3 \ | |
21 | - -I $(JRTP_ROOT)/jthread/include/jthread \ | |
22 | - -I $(TOP_DIR)/src/gb28181 \ | |
23 | - -I $(TOP_DIR)/src/nvdec \ | |
24 | - -I $(CUDA_ROOT)/include \ | |
25 | - | |
26 | -LIBSPATH= -L $(JRTP_ROOT)/jthread/lib -l:libjthread.a \ | |
27 | - -L $(JRTP_ROOT)/jrtplib/lib -l:libjrtp.a \ | |
28 | - -L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid -lcurand -lcublas -lnvjpeg \ | |
29 | - | |
30 | - | |
31 | -CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(LIBSPATH) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings | |
32 | - | |
33 | - | |
34 | -# 最终目标文件 | |
35 | -TARGET:=$(LIB_DIR)/$(MODULE).a | |
36 | - | |
37 | - | |
38 | -# 默认最终目标 | |
39 | -.PHONY:all | |
40 | -all:$(TARGET) | |
41 | - | |
42 | -# 生成最终目标 | |
43 | -$(TARGET):$(OBJS) | $(LIB_DIR) | |
44 | - @echo -e "\e[32m""Linking static library $(TARGET)""\e[0m" | |
45 | - @echo -e "ar -rc $@ $^" | |
46 | - @ar -rc $@ $^ | |
47 | - | |
48 | -# 若没有lib目录则自动生成 | |
49 | -$(LIB_DIR): | |
50 | - @mkdir -p $@ | |
51 | - | |
52 | -# 生成中间目标文件 | |
53 | -$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR) | |
54 | - @echo -e "\e[33m""Building object $@""\e[0m" | |
55 | - @echo -e "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBS) $(MACROS) -o $@ $<" | |
56 | -# @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBSPATH) $(MACROS) -o $@ $(MODULE_LIBS) $< | |
57 | - @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBS) $(MACROS) -o $@ $< | |
58 | - | |
59 | -# 若没有obj目录则自动生成 | |
60 | -$(OBJ_DIR): | |
61 | - @mkdir -p $@ | |
62 | - | |
63 | -# 若没有.dep目录则自动生成 | |
64 | -$(DEP_DIR): | |
65 | - @mkdir -p $@ | |
66 | - | |
67 | -# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错 | |
68 | -$(DEPS): | |
69 | - | |
70 | -# 引入中间目标文件头文件依赖关系 | |
71 | -include $(wildcard $(DEPS)) | |
72 | - | |
73 | -# 直接删除组件build目录 | |
74 | -.PHONY:clean | |
75 | -clean: | |
76 | - @rm -rf $(BUILD_DIR)/$(MODULE) |
src/demo/demo.cpp
1 | 1 | #include "../ai_platform/stl_aiplatform.h" |
2 | 2 | #include <chrono> |
3 | +#include <thread> | |
3 | 4 | #include <stdio.h> |
4 | 5 | #include <string.h> |
5 | 6 | #include <stdlib.h> |
... | ... | @@ -1330,6 +1331,26 @@ init_mq_conn(handle); |
1330 | 1331 | |
1331 | 1332 | |
1332 | 1333 | |
1334 | + int status = -1; | |
1335 | + while (true) | |
1336 | + { | |
1337 | + status = get_task_status(handle,"34020000001320000207"); | |
1338 | + if (status == 0) | |
1339 | + { | |
1340 | + createTask_dvpp28181(handle, algor_vec, 4, false); | |
1341 | + } | |
1342 | + | |
1343 | + status = get_task_status(handle,"34020000001310000176"); | |
1344 | + if (status == 0) | |
1345 | + { | |
1346 | + createTask_dvpp28181(handle, algor_vec, 5, false); | |
1347 | + } | |
1348 | + | |
1349 | + std::this_thread::sleep_for(std::chrono::seconds(5)); | |
1350 | + } | |
1351 | + | |
1352 | + | |
1353 | + | |
1333 | 1354 | char ch = 'a'; |
1334 | 1355 | while (ch != 'q') { |
1335 | 1356 | ch = getchar(); |
... | ... | @@ -1389,12 +1410,12 @@ int main(int argc, char *argv[]) { |
1389 | 1410 | // int repeat_num = atoi(argv[3]); |
1390 | 1411 | // int gpuID = atoi(argv[4]); |
1391 | 1412 | |
1392 | - test_gpu(0); | |
1413 | + // test_gpu(0); | |
1393 | 1414 | // test_gpu(1); |
1394 | 1415 | // test_gpu(2); |
1395 | 1416 | // test_gpu(3); |
1396 | 1417 | |
1397 | - // test_dvpp28181(0); | |
1418 | + test_dvpp28181(0); | |
1398 | 1419 | |
1399 | 1420 | printf("Done.\n"); |
1400 | 1421 | ... | ... |