Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
14c50d2f
Commit
14c50d2f
authored
May 13, 2013
by
Vadim Pisarevsky
Committed by
OpenCV Buildbot
May 13, 2013
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #874 from pengx17:master_queryDeviceInfo_rewrite
parents
6e44e0a4
e5ea0181
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
60 additions
and
80 deletions
+60
-80
surf.ocl.cpp
modules/nonfree/src/surf.ocl.cpp
+15
-19
util.hpp
modules/ocl/include/opencv2/ocl/private/util.hpp
+11
-6
initialization.cpp
modules/ocl/src/initialization.cpp
+34
-55
No files found.
modules/nonfree/src/surf.ocl.cpp
View file @
14c50d2f
...
...
@@ -59,32 +59,28 @@ namespace cv
const
char
noImage2dOption
[]
=
"-D DISABLE_IMAGE2D"
;
static
char
SURF_OPTIONS
[
1024
]
=
""
;
static
bool
USE_IMAGE2d
=
false
;
static
bool
use_image2d
=
false
;
static
void
openCLExecuteKernelSURF
(
Context
*
clCxt
,
const
char
**
source
,
String
kernelName
,
size_t
globalThreads
[
3
],
size_t
localThreads
[
3
],
std
::
vector
<
std
::
pair
<
size_t
,
const
void
*>
>
&
args
,
int
channels
,
int
depth
)
{
char
*
pSURF_OPTIONS
=
SURF_OPTIONS
;
static
bool
OPTION_INIT
=
false
;
if
(
!
OPTION_INIT
)
char
optBuf
[
100
]
=
{
0
}
;
char
*
optBufPtr
=
optBuf
;
if
(
!
use_image2d
)
{
if
(
!
USE_IMAGE2d
)
{
strcat
(
pSURF_OPTIONS
,
noImage2dOption
);
pSURF_OPTIONS
+=
strlen
(
noImage2dOption
);
}
size_t
wave_size
=
0
;
queryDeviceInfo
(
WAVEFRONT_SIZE
,
&
wave_size
);
std
::
sprintf
(
pSURF_OPTIONS
,
"-D WAVE_SIZE=%d"
,
static_cast
<
int
>
(
wave_size
));
OPTION_INIT
=
true
;
strcat
(
optBufPtr
,
noImage2dOption
);
optBufPtr
+=
strlen
(
noImage2dOption
);
}
openCLExecuteKernel
(
clCxt
,
source
,
kernelName
,
globalThreads
,
localThreads
,
args
,
channels
,
depth
,
SURF_OPTIONS
);
cl_kernel
kernel
;
kernel
=
openCLGetKernelFromSource
(
clCxt
,
source
,
kernelName
,
optBufPtr
);
size_t
wave_size
=
queryDeviceInfo
<
WAVEFRONT_SIZE
,
size_t
>
(
kernel
);
CV_Assert
(
clReleaseKernel
(
kernel
)
==
CL_SUCCESS
);
sprintf
(
optBufPtr
,
"-D WAVE_SIZE=%d"
,
static_cast
<
int
>
(
wave_size
));
openCLExecuteKernel
(
clCxt
,
source
,
kernelName
,
globalThreads
,
localThreads
,
args
,
channels
,
depth
,
optBufPtr
);
}
}
}
static
inline
size_t
divUp
(
size_t
total
,
size_t
grain
)
{
return
(
total
+
grain
-
1
)
/
grain
;
...
...
@@ -166,11 +162,11 @@ public:
{
bindImgTex
(
img
,
imgTex
);
bindImgTex
(
surf_
.
sum
,
sumTex
);
USE_IMAGE
2d
=
true
;
use_image
2d
=
true
;
}
catch
(
const
cv
::
Exception
&
e
)
{
USE_IMAGE
2d
=
false
;
use_image
2d
=
false
;
if
(
e
.
code
!=
CL_IMAGE_FORMAT_NOT_SUPPORTED
&&
e
.
code
!=
-
217
)
{
throw
e
;
...
...
modules/ocl/include/opencv2/ocl/private/util.hpp
View file @
14c50d2f
...
...
@@ -125,16 +125,21 @@ namespace cv
bool
CV_EXPORTS
support_image2d
(
Context
*
clCxt
=
Context
::
getContext
());
// the enums are used to query device information
// currently only support wavefront size queries
enum
DEVICE_INFO
{
WAVEFRONT_SIZE
,
//in AMD speak
WARP_SIZE
=
WAVEFRONT_SIZE
,
//in nvidia speak
IS_CPU_DEVICE
//check if the device is CPU
WAVEFRONT_SIZE
,
IS_CPU_DEVICE
};
//info should have been pre-allocated
void
CV_EXPORTS
queryDeviceInfo
(
DEVICE_INFO
info_type
,
void
*
info
);
template
<
DEVICE_INFO
_it
,
typename
_ty
>
_ty
queryDeviceInfo
(
cl_kernel
kernel
=
NULL
);
//only these three specializations are implemented at the moment
template
<>
int
CV_EXPORTS
queryDeviceInfo
<
WAVEFRONT_SIZE
,
int
>
(
cl_kernel
kernel
);
template
<>
size_t
CV_EXPORTS
queryDeviceInfo
<
WAVEFRONT_SIZE
,
size_t
>
(
cl_kernel
kernel
);
template
<>
bool
CV_EXPORTS
queryDeviceInfo
<
IS_CPU_DEVICE
,
bool
>
(
cl_kernel
kernel
);
}
//namespace ocl
}
//namespace cv
...
...
modules/ocl/src/initialization.cpp
View file @
14c50d2f
...
...
@@ -362,64 +362,43 @@ namespace cv
clFinish
(
Context
::
getContext
()
->
impl
->
clCmdQueue
);
}
void
queryDeviceInfo
(
DEVICE_INFO
info_type
,
void
*
info
)
//template specializations of queryDeviceInfo
template
<>
bool
queryDeviceInfo
<
IS_CPU_DEVICE
,
bool
>
(
cl_kernel
)
{
static
Info
::
Impl
*
impl
=
Context
::
getContext
()
->
impl
;
switch
(
info_type
)
{
case
WAVEFRONT_SIZE
:
{
bool
is_cpu
=
false
;
queryDeviceInfo
(
IS_CPU_DEVICE
,
&
is_cpu
);
if
(
is_cpu
)
{
*
(
int
*
)
info
=
1
;
return
;
}
#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
try
{
openCLSafeCall
(
clGetDeviceInfo
(
Context
::
getContext
()
->
impl
->
devices
[
0
],
CL_DEVICE_WAVEFRONT_WIDTH_AMD
,
sizeof
(
size_t
),
info
,
0
));
}
catch
(
const
cv
::
Exception
&
)
#elif defined (CL_DEVICE_WARP_SIZE_NV)
const
int
EXT_LEN
=
4096
+
1
;
char
extends_set
[
EXT_LEN
];
size_t
extends_size
;
openCLSafeCall
(
clGetDeviceInfo
(
impl
->
devices
[
impl
->
devnum
],
CL_DEVICE_EXTENSIONS
,
EXT_LEN
,
(
void
*
)
extends_set
,
&
extends_size
));
extends_set
[
EXT_LEN
-
1
]
=
0
;
if
(
std
::
string
(
extends_set
).
find
(
"cl_nv_device_attribute_query"
)
!=
std
::
string
::
npos
)
{
openCLSafeCall
(
clGetDeviceInfo
(
Context
::
getContext
()
->
impl
->
devices
[
0
],
CL_DEVICE_WARP_SIZE_NV
,
sizeof
(
size_t
),
info
,
0
));
}
else
#endif
{
// if no way left for us to query the warp size, we can get it from kernel group info
static
const
char
*
_kernel_string
=
"__kernel void test_func() {}"
;
cl_kernel
kernel
;
kernel
=
openCLGetKernelFromSource
(
Context
::
getContext
(),
&
_kernel_string
,
"test_func"
);
openCLSafeCall
(
clGetKernelWorkGroupInfo
(
kernel
,
impl
->
devices
[
impl
->
devnum
],
CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
,
sizeof
(
size_t
),
info
,
NULL
));
}
Info
::
Impl
*
impl
=
Context
::
getContext
()
->
impl
;
cl_device_type
devicetype
;
openCLSafeCall
(
clGetDeviceInfo
(
impl
->
devices
[
impl
->
devnum
],
CL_DEVICE_TYPE
,
sizeof
(
cl_device_type
),
&
devicetype
,
NULL
));
return
(
devicetype
==
CVCL_DEVICE_TYPE_CPU
);
}
}
break
;
case
IS_CPU_DEVICE
:
{
cl_device_type
devicetype
;
openCLSafeCall
(
clGetDeviceInfo
(
impl
->
devices
[
impl
->
devnum
],
CL_DEVICE_TYPE
,
sizeof
(
cl_device_type
),
&
devicetype
,
NULL
));
*
(
bool
*
)
info
=
(
devicetype
==
CVCL_DEVICE_TYPE_CPU
);
}
break
;
default
:
CV_Error
(
-
1
,
"Invalid device info type"
);
break
;
template
<
typename
_ty
>
static
_ty
queryWavesize
(
cl_kernel
kernel
)
{
size_t
info
=
0
;
Info
::
Impl
*
impl
=
Context
::
getContext
()
->
impl
;
bool
is_cpu
=
queryDeviceInfo
<
IS_CPU_DEVICE
,
bool
>
();
if
(
is_cpu
)
{
return
1
;
}
CV_Assert
(
kernel
!=
NULL
);
openCLSafeCall
(
clGetKernelWorkGroupInfo
(
kernel
,
impl
->
devices
[
impl
->
devnum
],
CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
,
sizeof
(
size_t
),
&
info
,
NULL
));
return
static_cast
<
_ty
>
(
info
);
}
template
<>
size_t
queryDeviceInfo
<
WAVEFRONT_SIZE
,
size_t
>
(
cl_kernel
kernel
)
{
return
queryWavesize
<
size_t
>
(
kernel
);
}
template
<>
int
queryDeviceInfo
<
WAVEFRONT_SIZE
,
int
>
(
cl_kernel
kernel
)
{
return
queryWavesize
<
int
>
(
kernel
);
}
void
openCLReadBuffer
(
Context
*
clCxt
,
cl_mem
dst_buffer
,
void
*
host_buffer
,
size_t
size
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment