本程序生成一个OpenCL Program,然后获取Program的source,事实上它的source就是一个char[],能够打印出来。
然后我们把这些内容和原来文本的内容对照,看看是否是我们想要读入的内容。
还能够測试是否编译正确,假设不对会有输出提示的。
以下程序执行例如以下:
前面都是读入的函数代码。然后后面检查这些函数是否正确,能够看到第二个函数不对,由于*r未定义。
以下是完整代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> #ifdef MAC
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif namespace program_build
{ const static int NUM_FILES = 2;
const char PROGRAM_FILE_1[] = "good.cl";
const char *PROGRAM_FILE_2 = "bad.cl"; int run()
{
/*program能够包括多个kernel,一个kernel相当于一个功能函数,由program包括在内存中,然后就能够使用kernel的功能了。
1 须要使用kernel,创建program,把kernel读入内存
2 须要把program和device连接起来
Host/device data structures */
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_int i, err; /* Program data structures */
cl_program program;
FILE *program_handle;
char *program_buffer[NUM_FILES];
char *program_log;
const char *file_name[] = {PROGRAM_FILE_1, PROGRAM_FILE_2};
const char options[] = "-cl-finite-math-only -cl-no-signed-zeros";
size_t program_size[NUM_FILES];
size_t log_size; /* Access the first installed platform */
err = clGetPlatformIDs(1, &platform, NULL);
if(err < 0) {
perror("Couldn't find any platforms");
exit(1);
} /* Access the first GPU/CPU */
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
if(err == CL_DEVICE_NOT_FOUND) {
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device, NULL);
}
if(err < 0) {
perror("Couldn't find any devices");
exit(1);
} /* Create a context */
context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);
if(err < 0) {
perror("Couldn't create a context");
exit(1);
} /* Read each program file and place content into buffer array */
for(i=0; i<NUM_FILES; i++) { program_handle = fopen(file_name[i], "r");
if(program_handle == NULL) {
perror("Couldn't find the program file");
exit(1);
}
fseek(program_handle, 0, SEEK_END);
program_size[i] = ftell(program_handle);
rewind(program_handle);
program_buffer[i] = (char*)malloc(program_size[i]+1);
program_buffer[i][program_size[i]] = '\0';
fread(program_buffer[i], sizeof(char), program_size[i],
program_handle);
fclose(program_handle);
} /* Create a program containing all program content */
program = clCreateProgramWithSource(context, NUM_FILES,
(const char**)program_buffer, program_size, &err);
if(err < 0) {
perror("Couldn't create the program");
exit(1);
} /* Build program
but one provision is crucial: every compiler must be accessible through clBuild-Program. This function compiles and links a cl_program for devices associated with the platform. It doesn’t return a new cl_program, but instead modifies the input data structure.
*/ err = clBuildProgram(program, 1, &device, options, NULL, NULL); int bufSize = program_size[0] + program_size[1] + 1;
char *programBuffer = (char *) malloc(bufSize);
clGetProgramInfo(program, CL_PROGRAM_SOURCE, bufSize, programBuffer, NULL);
printf("Print Program Source:\n");
printf("\n %s \n", programBuffer); printf("Check if it is correct:\n");
for (int i = 0; i < NUM_FILES; i++)
{
printf("\n %s \n", program_buffer[i]);
} if(err < 0)
{
clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG,
0, NULL, &log_size);
program_log = (char*) malloc(log_size+1);
program_log[log_size] = '\0';
clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG,
log_size+1, program_log, NULL);
printf("%s\n", program_log);
free(program_log);
system("pause");
exit(1);
} /* Deallocate resources */
for(i=0; i<NUM_FILES; i++) {
free(program_buffer[i]);
}
clReleaseProgram(program);
clReleaseContext(context);
system("pause"); return 0;
} }