OpenCL 获取Program信息

本程序生成一个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;
}

}



posted @ 2014-06-08 18:10  hrhguanli  阅读(462)  评论(0编辑  收藏  举报