Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
296f76a1
O
Opencv
项目概览
Greenplum
/
Opencv
9 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
296f76a1
编写于
11月 06, 2013
作者:
A
Andrey Pavlenko
提交者:
OpenCV Buildbot
11月 06, 2013
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1756 from alalek:ocl_workaround_memory_leaks_with_subbuffer
上级
9afe65e5
03646e7e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
46 addition
and
29 deletion
+46
-29
modules/ocl/src/cl_operations.cpp
modules/ocl/src/cl_operations.cpp
+46
-29
未找到文件。
modules/ocl/src/cl_operations.cpp
浏览文件 @
296f76a1
...
...
@@ -148,35 +148,52 @@ void openCLMallocPitchEx(Context *ctx, void **dev_ptr, size_t *pitch,
{
cl_int
status
;
size_t
size
=
widthInBytes
*
height
;
bool
useSubBuffers
=
#ifndef MEMORY_CORRUPTION_GUARD
*
dev_ptr
=
clCreateBuffer
(
getClContext
(
ctx
),
gDevMemRWValueMap
[
rw_type
]
|
gDevMemTypeValueMap
[
mem_type
],
size
,
0
,
&
status
);
openCLVerifyCall
(
status
);
false
;
#else
size_t
allocSize
=
size
+
__memory_corruption_guard_bytes
*
2
;
cl_mem
mainBuffer
=
clCreateBuffer
(
getClContext
(
ctx
),
gDevMemRWValueMap
[
rw_type
]
|
gDevMemTypeValueMap
[
mem_type
],
allocSize
,
0
,
&
status
);
openCLVerifyCall
(
status
);
cl_buffer_region
r
=
{
__memory_corruption_guard_bytes
,
size
};
*
dev_ptr
=
clCreateSubBuffer
(
mainBuffer
,
gDevMemRWValueMap
[
rw_type
]
|
gDevMemTypeValueMap
[
mem_type
],
CL_BUFFER_CREATE_TYPE_REGION
,
&
r
,
&
status
);
openCLVerifyCall
(
status
);
true
;
#endif
const
DeviceInfo
&
devInfo
=
ctx
->
getDeviceInfo
();
if
(
useSubBuffers
&&
devInfo
.
isIntelDevice
)
{
useSubBuffers
=
false
;
// TODO FIXIT We observe memory leaks then we working with sub-buffers
// on the CPU device of Intel OpenCL SDK (Linux). We will investigate this later.
}
if
(
!
useSubBuffers
)
{
*
dev_ptr
=
clCreateBuffer
(
getClContext
(
ctx
),
gDevMemRWValueMap
[
rw_type
]
|
gDevMemTypeValueMap
[
mem_type
],
size
,
0
,
&
status
);
openCLVerifyCall
(
status
);
}
#ifdef MEMORY_CORRUPTION_GUARD
else
{
size_t
allocSize
=
size
+
__memory_corruption_guard_bytes
*
2
;
cl_mem
mainBuffer
=
clCreateBuffer
(
getClContext
(
ctx
),
gDevMemRWValueMap
[
rw_type
]
|
gDevMemTypeValueMap
[
mem_type
],
allocSize
,
0
,
&
status
);
openCLVerifyCall
(
status
);
cl_buffer_region
r
=
{
__memory_corruption_guard_bytes
,
size
};
*
dev_ptr
=
clCreateSubBuffer
(
mainBuffer
,
gDevMemRWValueMap
[
rw_type
]
|
gDevMemTypeValueMap
[
mem_type
],
CL_BUFFER_CREATE_TYPE_REGION
,
&
r
,
&
status
);
openCLVerifyCall
(
status
);
#ifdef CHECK_MEMORY_CORRUPTION
std
::
vector
<
int
>
tmp
(
__memory_corruption_guard_bytes
/
sizeof
(
int
),
__memory_corruption_check_pattern
);
CV_Assert
(
tmp
.
size
()
*
sizeof
(
int
)
==
__memory_corruption_guard_bytes
);
openCLVerifyCall
(
clEnqueueWriteBuffer
(
getClCommandQueue
(
ctx
),
mainBuffer
,
CL_FALSE
,
0
,
__memory_corruption_guard_bytes
,
&
tmp
[
0
],
0
,
NULL
,
NULL
));
openCLVerifyCall
(
clEnqueueWriteBuffer
(
getClCommandQueue
(
ctx
),
mainBuffer
,
CL_FALSE
,
__memory_corruption_guard_bytes
+
size
,
__memory_corruption_guard_bytes
,
&
tmp
[
0
],
0
,
NULL
,
NULL
));
clFinish
(
getClCommandQueue
(
ctx
));
std
::
vector
<
int
>
tmp
(
__memory_corruption_guard_bytes
/
sizeof
(
int
),
__memory_corruption_check_pattern
);
CV_Assert
(
tmp
.
size
()
*
sizeof
(
int
)
==
__memory_corruption_guard_bytes
);
openCLVerifyCall
(
clEnqueueWriteBuffer
(
getClCommandQueue
(
ctx
),
mainBuffer
,
CL_FALSE
,
0
,
__memory_corruption_guard_bytes
,
&
tmp
[
0
],
0
,
NULL
,
NULL
));
openCLVerifyCall
(
clEnqueueWriteBuffer
(
getClCommandQueue
(
ctx
),
mainBuffer
,
CL_FALSE
,
__memory_corruption_guard_bytes
+
size
,
__memory_corruption_guard_bytes
,
&
tmp
[
0
],
0
,
NULL
,
NULL
));
clFinish
(
getClCommandQueue
(
ctx
));
#endif
CheckBuffers
data
(
mainBuffer
,
size
,
widthInBytes
,
height
);
__check_buffers
.
insert
(
std
::
pair
<
cl_mem
,
CheckBuffers
>
((
cl_mem
)
*
dev_ptr
,
data
));
CheckBuffers
data
(
mainBuffer
,
size
,
widthInBytes
,
height
);
__check_buffers
.
insert
(
std
::
pair
<
cl_mem
,
CheckBuffers
>
((
cl_mem
)
*
dev_ptr
,
data
));
}
#endif
*
pitch
=
widthInBytes
;
}
...
...
@@ -230,6 +247,7 @@ void openCLCopyBuffer2D(Context *ctx, void *dst, size_t dpitch, int dst_offset,
void
openCLFree
(
void
*
devPtr
)
{
openCLSafeCall
(
clReleaseMemObject
((
cl_mem
)
devPtr
));
#ifdef MEMORY_CORRUPTION_GUARD
#ifdef CHECK_MEMORY_CORRUPTION
bool
failBefore
=
false
,
failAfter
=
false
;
...
...
@@ -270,9 +288,7 @@ void openCLFree(void *devPtr)
openCLSafeCall
(
clReleaseMemObject
(
data
.
mainBuffer
));
__check_buffers
.
erase
(
i
);
}
#endif
openCLSafeCall
(
clReleaseMemObject
((
cl_mem
)
devPtr
));
#if defined(MEMORY_CORRUPTION_GUARD) && defined(CHECK_MEMORY_CORRUPTION)
#if defined(CHECK_MEMORY_CORRUPTION)
if
(
failBefore
)
{
#ifdef CHECK_MEMORY_CORRUPTION_PRINT_ERROR
...
...
@@ -291,7 +307,8 @@ void openCLFree(void *devPtr)
CV_Error
(
CV_StsInternal
,
"Memory corruption detected: after buffer"
);
#endif
}
#endif
#endif // CHECK_MEMORY_CORRUPTION
#endif // MEMORY_CORRUPTION_GUARD
}
cl_kernel
openCLGetKernelFromSource
(
const
Context
*
ctx
,
const
cv
::
ocl
::
ProgramEntry
*
source
,
string
kernelName
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录