code for compiling cl Code
This commit is contained in:
parent
016cd00613
commit
9bfe5e0b30
@ -10,6 +10,7 @@ message(STATUS "OpenCL CXX includes: ${OPENCL_HAS_CPP_BINDINGS}")
|
|||||||
message(STATUS "OpenCL libraries: ${OPENCL_LIBRARIES}")
|
message(STATUS "OpenCL libraries: ${OPENCL_LIBRARIES}")
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} "main.c")
|
add_executable(${PROJECT_NAME} "main.c")
|
||||||
|
configure_file("saxpy.cl" "cl_kernels/saxpy.cl" COPYONLY)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} ${OPENCL_LIBRARIES})
|
target_link_libraries(${PROJECT_NAME} ${OPENCL_LIBRARIES})
|
||||||
include_directories(${PROJECT_NAME} ${OPENCL_INCLUDE_DIR})
|
include_directories(${PROJECT_NAME} ${OPENCL_INCLUDE_DIR})
|
||||||
|
89
main.c
89
main.c
@ -2,8 +2,50 @@
|
|||||||
#include <CL/cl.h>
|
#include <CL/cl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
int main()
|
|
||||||
|
void check_error(cl_int error)
|
||||||
|
{
|
||||||
|
if (error != CL_SUCCESS) {
|
||||||
|
printf("OpenCL call failed with error %d\n", (int)error);
|
||||||
|
exit(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_kernel_from_file(char *file, char **src)
|
||||||
|
{
|
||||||
|
long fsize;
|
||||||
|
FILE *f = fopen(file, "rb");
|
||||||
|
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
fsize = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET); //same as rewind(f);
|
||||||
|
*src = (char *)malloc(fsize + 1);
|
||||||
|
fread(*src, fsize, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
(*src)[fsize] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_program create_program(char *src, cl_context context)
|
||||||
|
{
|
||||||
|
cl_program program;
|
||||||
|
size_t lengths[1];
|
||||||
|
cl_int error = 0;
|
||||||
|
|
||||||
|
lengths[0] = strlen(src);
|
||||||
|
printf("strlen: %u\n", (unsigned int)lengths[0]);
|
||||||
|
program = clCreateProgramWithSource(context, 1, (const char **)&src,
|
||||||
|
lengths, &error);
|
||||||
|
check_error(error);
|
||||||
|
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
|
float test_a[] = {21.321, 213.213, 3213.23};
|
||||||
|
float test_b[] = {21.21, 13.213, 17.2553};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
cl_int error;
|
cl_int error;
|
||||||
@ -13,31 +55,37 @@ int main()
|
|||||||
cl_uint device_id_count = 0;
|
cl_uint device_id_count = 0;
|
||||||
cl_context_properties context_properties[4];
|
cl_context_properties context_properties[4];
|
||||||
cl_context context;
|
cl_context context;
|
||||||
|
cl_program program;
|
||||||
|
cl_kernel kernel;
|
||||||
|
cl_mem a_buff, b_buff;
|
||||||
|
char *source_code = NULL;
|
||||||
|
|
||||||
clGetPlatformIDs (0, NULL, &platform_id_count);
|
clGetPlatformIDs(0, NULL, &platform_id_count);
|
||||||
if (platform_id_count == 0)
|
if (platform_id_count == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
platform_ids = (cl_platform_id*) malloc(platform_id_count *
|
platform_ids = (cl_platform_id *)malloc(platform_id_count *
|
||||||
sizeof(cl_platform_id));
|
sizeof(cl_platform_id));
|
||||||
if (platform_ids == NULL)
|
if (platform_ids == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
clGetPlatformIDs (platform_id_count, platform_ids, NULL);
|
clGetPlatformIDs(platform_id_count, platform_ids, NULL);
|
||||||
|
|
||||||
printf("Platforms available: %u\n", (unsigned int)platform_id_count);
|
printf("Platforms available: %u\n", (unsigned int)platform_id_count);
|
||||||
|
|
||||||
|
|
||||||
clGetDeviceIDs (platform_ids[0], CL_DEVICE_TYPE_ALL, 0, NULL,
|
clGetDeviceIDs(platform_ids[0], CL_DEVICE_TYPE_ALL, 0, NULL,
|
||||||
&device_id_count);
|
&device_id_count);
|
||||||
printf("Device in Platform 0 count: %u\n", (unsigned int)device_id_count);
|
printf("Device in Platform 0 count: %u\n",
|
||||||
|
(unsigned int)device_id_count);
|
||||||
|
|
||||||
if (device_id_count == 0)
|
if (device_id_count == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
device_ids = (cl_device_id*) malloc(sizeof(cl_device_id)*device_id_count);
|
device_ids = (cl_device_id *) malloc(sizeof(cl_device_id)
|
||||||
|
*device_id_count);
|
||||||
|
|
||||||
clGetDeviceIDs (platform_ids[0], CL_DEVICE_TYPE_ALL, device_id_count,
|
clGetDeviceIDs(platform_ids[0], CL_DEVICE_TYPE_ALL, device_id_count,
|
||||||
device_ids, NULL);
|
device_ids, NULL);
|
||||||
|
|
||||||
context_properties[0] = CL_CONTEXT_PLATFORM;
|
context_properties[0] = CL_CONTEXT_PLATFORM;
|
||||||
@ -45,9 +93,32 @@ int main()
|
|||||||
context_properties[2] = context_properties[3] = 0;
|
context_properties[2] = context_properties[3] = 0;
|
||||||
|
|
||||||
|
|
||||||
context = clCreateContext (context_properties, device_id_count,
|
context = clCreateContext(context_properties, device_id_count,
|
||||||
device_ids, NULL,
|
device_ids, NULL,
|
||||||
NULL, &error);
|
NULL, &error);
|
||||||
|
check_error(error);
|
||||||
|
|
||||||
|
load_kernel_from_file("cl_kernels/saxpy.cl", &source_code);
|
||||||
|
program = create_program(source_code, context);
|
||||||
|
|
||||||
|
/* Compile the source code */
|
||||||
|
check_error(clBuildProgram(program, device_id_count,
|
||||||
|
device_ids, NULL, NULL, NULL));
|
||||||
|
|
||||||
|
|
||||||
|
kernel = clCreateKernel(program, "SAXPY", &error);
|
||||||
|
|
||||||
|
|
||||||
|
/* Create memory buffers for data */
|
||||||
|
a_buff = clCreateBuffer(context, CL_MEM_READ_ONLY |
|
||||||
|
CL_MEM_COPY_HOST_PTR,
|
||||||
|
sizeof(test_a), test_a, &error);
|
||||||
|
check_error(error);
|
||||||
|
|
||||||
|
b_buff = clCreateBuffer(context, CL_MEM_READ_WRITE |
|
||||||
|
CL_MEM_COPY_HOST_PTR,
|
||||||
|
sizeof(test_b), test_b, &error);
|
||||||
|
check_error(error);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user