OpenCL test program
책의 예제를 넣어서 실행
책에서 오류가 두군데가 있었다.
(1) ifdef에서 APPLE platform을 확인하는 매크로 정의 오류
== WAS ==
#ifdef APPLE
== IS ==
#ifdef __APPLE__
(2) OpenCL의 원칙은 OpenCL에 정보의 크기를 물어서 확인하고 그만큼 공간을 만든뒤에 그 정보를 받아들이는 것인데
예제에서는 정보를 물어서 공간을 만드는 데 까지는 있지만, 그 이후에 정보를 다시 받아들이는 함수를 호출 하지 않았다.
....
main(...)
{
...
먼저 필요한 공간의 크기를 확인
error = clGetPlatformIDs(0,
NULL,
&numOfPlatforms
);
if ( error < 0)
...
공간을 확보 하고
이제 확보된 공간으로 값을 받아온다.
error = clGetPlatformIDs(numOfPlatforms, <== 이 함수를 호출 하는 것을 추가함.
platforms,
NULL
);
...
}
전체 코드는 아래와 같다.
//
// main.cpp
// TestOpenCL
//
// Created by freegear on 2014. 2. 8..
// Copyright (c) 2014년 freegear. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
void displayPlatformInfo(
cl_platform_id id ,
cl_platform_info param_name,
const char * paramNameAsStr
)
{
cl_int error = 0 ;
size_t paramSize = 0 ;
error = clGetPlatformInfo(
id,
param_name,
0,
NULL,
¶mSize
);
char * moreInfo = (char *) alloca(sizeof(char)*paramSize);
error = clGetPlatformInfo(
id, /* The platform ID returned by clGetPlatformIDs or can be NULL.
If platform is NULL, the behavior is implementation-defined.*/
param_name, /* An enumeration constant that identifies the platform
information being queried. It can be one of the following values
as specified in the table below. */
paramSize, /* Specifies the size in bytes of memory pointed to by param_value.
This size in bytes must be greater than or equal to size of return type
specified in the table below. */
moreInfo, /* A pointer to memory location where appropriate values for a given
param_value will be returned. Acceptable param_value values are listed in
the table below. If param_value is NULL, it is ignored.*/
NULL /* Returns the actual size in bytes of data being queried by param_value.
If param_value_size_ret is NULL, it is ignored */
);
if( error != CL_SUCCESS)
{
if ( error == CL_INVALID_PLATFORM)
perror("Error CL_INVALID_PLATFORM");
else if (error == CL_INVALID_VALUE)
perror("Error CL_INVALID_VALUE");
else
perror("Unable to find any OpenCL platform information");
return ;
}
printf("%s : %s\n" , paramNameAsStr, moreInfo);
} // end of displayPlatformInfo
int main(int argc, const char * argv[])
{
// OpenCL 1.2 Data struction
cl_platform_id * platforms ;
/* OpenCL 1.1 scalar data types */
cl_uint numOfPlatforms ;
cl_int error ;
/*
Get the number of platforms
Remember that for each vendor's SDK installed on the computer,
the number of available platform also increased.
*/
error = clGetPlatformIDs(0, /*
The number of cl_platform_id entries that can be added to platforms.
If platforms is not NULL, the num_entries must be greater than zero.
*/
NULL, /* Returns a list of OpenCL platforms found.
The cl_platform_id values returned in platforms can be used to identify
a specific OpenCL platform. If platforms argument is NULL,
this argument is ignored.
The number of OpenCL platforms returned is the mininum of the value
specified by num_entries or the number of OpenCL platforms available. */
&numOfPlatforms
/* Returns the number of OpenCL platforms available.
If num_platforms is NULL, this argument is ignored. */
);
if ( error < 0)
{
perror("Unable to find any OpenCL platforms");
exit(1);
}
// allocate memory for the number of installed platforms
// alloca(....) occupies some stack space but is
// automatically freed on return
platforms = (cl_platform_id*) alloca(sizeof(cl_platform_id)*numOfPlatforms);
printf("Number of OpenCL platforms found : %d\n", numOfPlatforms);
error = clGetPlatformIDs(numOfPlatforms, /*
The number of cl_platform_id entries that can be added to platforms.
If platforms is not NULL, the num_entries must be greater than zero.
*/
platforms, /* Returns a list of OpenCL platforms found.
The cl_platform_id values returned in platforms can be used to identify
a specific OpenCL platform. If platforms argument is NULL,
this argument is ignored.
The number of OpenCL platforms returned is the mininum of the value
specified by num_entries or the number of OpenCL platforms available. */
NULL
/* Returns the number of OpenCL platforms available.
If num_platforms is NULL, this argument is ignored. */
);
if ( error < 0)
{
perror("Unable to find any OpenCL platforms");
exit(1);
}
// We invoke the API 'clPlatformInfo' twice for each
// parameter we are trying to extract
// and we use the return value to create temporary data
// structure (on the stack) to store
// the returned information ot the second invocation.
for( cl_uint i = 0 ; i < numOfPlatforms ; ++i)
{
displayPlatformInfo( platforms[i], CL_PLATFORM_PROFILE , "CL_PLATFORM_PROFILE");
displayPlatformInfo( platforms[i], CL_PLATFORM_VERSION , "CL_PLATFORM_VERSION");
displayPlatformInfo( platforms[i], CL_PLATFORM_NAME , "CL_PLATFORM_NAME");
displayPlatformInfo( platforms[i], CL_PLATFORM_VENDOR , "CL_PLATFORM_VENDOR");
displayPlatformInfo( platforms[i], CL_PLATFORM_EXTENSIONS , "CL_PLATFORM_EXTENSIONS");
}
return 0;
}
실행 결과는 아래와 같다.
Number of OpenCL platforms found : 1
CL_PLATFORM_PROFILE : FULL_PROFILE
CL_PLATFORM_VERSION : OpenCL 1.2 (Aug 24 2013 21:03:27)
CL_PLATFORM_NAME : Apple
CL_PLATFORM_VENDOR : Apple
CL_PLATFORM_EXTENSIONS : cl_APPLE_SetMemObjectDestructor cl_APPLE_ContextLoggingFunctions cl_APPLE_clut cl_APPLE_query_kernel_names cl_APPLE_gl_sharing cl_khr_gl_event
'Computer Vision' 카테고리의 다른 글
OpenCL Test Program (3) (0) | 2014.03.31 |
---|---|
OpenCL Test Program (2) (0) | 2014.03.18 |
OpenCL Architecture (0) | 2014.03.15 |
Optical Flow에 의한 영상 정보 분석 (0) | 2013.05.28 |
OpenCV를 이용한 Face Detection (0) | 2013.05.19 |