kernel的循环调用主要是涉及缓冲区的创建和主机端命令同步;很多例子中会在创建缓存对象时对缓存对象做初始化,例如:
cl_mem memObject1 = clCreateBuffer(context,CL_MEM_READ_ONLY |
CL_MEM_COPY_HOST_PTR ,
sizeof(float) * MIXSIZE,&input1,&error);
在这里介绍两点:
其一
在本次实验中,我们需要将缓存对象的创建和数据传输分开执行,例如:
cl_mem memObject1 = clCreateBuffer(context,CL_MEM_READ_ONLY ,
sizeof(float) * MIXSIZE,NULL,&error);
error = clEnqueueWriteBuffer(queue, memObject1, CL_FALSE, 0,
MIXSIZE * sizeof(float), a_in, 0, NULL, NULL);
因为在循环调用中我们并不需要每次循环都创建缓存对象,只需要一次创建,以后只需要向缓存对象中写入数据即可;
其二
由于是循环调用,所以涉及到同步问题,主要是内核执行需要在数据读入之后进行;下一次循环需要在上一次循环结束之后开始。关于主机端同步,在上一篇博客中有介绍:
http://blog.csdn.net/u011028771/article/details/52761136
host.c
#include<stdio.h>
#include<windows.h>
#include<CL/cl.h>
#pragma warning( disable : 4996 )
#define MIXSIZE 8192
int main() {
cl_int error;
cl_platform_id platforms;
cl_device_id devices;
cl_context context;
FILE *program_handle;
size_t program_size;
char *program_buffer;
cl_program program;
size_t log_size;
char *program_log;
char kernel_name[] = "createBuffer";
cl_kernel kernel;
cl_command_queue queue;
//获取平台
error = clGetPlatformIDs(1, &platforms, NULL);
if (error != 0) {
printf("Get platform failed!");
return -1;
}
error = clGetDeviceIDs(platforms, CL_DEVICE_TYPE_GPU, 1, &devices, NULL);
if (error != 0) {
printf("Get device failed!");
return -1;
}
//创建上下文
context = clCreateContext(NULL,