OpenCL Eclipse加载但不读取内核文件

时间:2018-03-22 20:00:17

标签: c eclipse kernel opencl

我有问题。 OpenCL正在加载内核但是给出了垃圾值。如果我要猜测那么它就无法执行内核。该程序正在编译,但给出了垃圾值。所有库路径,包含和库都是正确的。该程序在实验室中工作。但它不适用于笔记本电脑。 这是主要的C文件: -

#include<stdio.h>
#include<stdlib.h>
#include<CL/cl.h>

//Max source size of the kernel string
#define MAX_SOURCE_SIZE (0x100000)

int main (void)
{
//create the two input vectors
int i;
int LIST_SIZE;
printf("Enter how many elements = ");
scanf("%d",&LIST_SIZE);
int *A = (int *)malloc(sizeof(int)*LIST_SIZE);

//Initialize the input vector

for(i=0;i<LIST_SIZE;i++)
{
    A[i] = i;
}
int *B = (int *)malloc(sizeof(int)*LIST_SIZE);
for(i=0;i<LIST_SIZE;i++)
{
    B[i] = i+10;
}
//Load the kernel source code into the array source_str
FILE *fp;
char *source_str;
size_t source_size;
fp = fopen("5-1.cl","r");
if(!fp)
{
    fprintf(stderr,"Failed to load kernel.\n");
    exit(1);
}
source_str = (char*)malloc(MAX_SOURCE_SIZE);
source_size = fread(source_str,1,MAX_SOURCE_SIZE,fp);
fclose(fp);

//Get platform and device information
cl_platform_id platform_id = NULL;
cl_device_id device_id = NULL;
cl_uint ret_num_devices;
cl_uint ret_num_platforms;
cl_int ret = clGetPlatformIDs(1,&platform_id,&ret_num_platforms);
ret = clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_CPU,1,&device_id,&ret_num_devices);

//Create an OpenCL context
cl_context context = clCreateContext(NULL,1,&device_id,NULL,NULL,&ret);

//Create a command queue
cl_command_queue command_queue = clCreateCommandQueue(context,device_id,NULL,&ret);

//Create memory buffers on the device for each vector A,B,C
cl_mem a_mem_obj = clCreateBuffer(context,CL_MEM_READ_ONLY, LIST_SIZE*sizeof(int),NULL,&ret);
cl_mem b_mem_obj = clCreateBuffer(context,CL_MEM_READ_ONLY, LIST_SIZE*sizeof(int),NULL,&ret);
cl_mem c_mem_obj = clCreateBuffer(context,CL_MEM_WRITE_ONLY, LIST_SIZE*sizeof(int),NULL,&ret);

//Copy the lists A and B to their respective memory buffers
ret = clEnqueueWriteBuffer(command_queue,a_mem_obj,CL_TRUE,0,LIST_SIZE*sizeof(int),A,0,NULL,NULL);
ret = clEnqueueWriteBuffer(command_queue,b_mem_obj,CL_TRUE,0,LIST_SIZE*sizeof(int),B,0,NULL,NULL);

//Create a program from the kernel source
cl_program program = clCreateProgramWithSource(context,1,(const char**)&source_str,(const size_t *)&source_size,&ret);

//Build the program
ret = clBuildProgram(program,1,&device_id,NULL,NULL,NULL);

//Create the OpenCL Kernel Object
cl_kernel kernel = clCreateKernel(program,"vector_add",&ret);

//Set the arguments of the kernel
ret = clSetKernelArg(kernel,0,sizeof(cl_mem),(void *)&a_mem_obj);
ret = clSetKernelArg(kernel,1,sizeof(cl_mem),(void *)&b_mem_obj);
ret = clSetKernelArg(kernel,2,sizeof(cl_mem),(void *)&c_mem_obj);

//Execute the OpenCL kernel on the array
size_t global_item_size = LIST_SIZE;
size_t local_item_size = 1;

//Execute the kernel on the device
cl_event event;
ret = clEnqueueNDRangeKernel(command_queue,kernel,1,NULL,&global_item_size,&local_item_size,0,NULL,NULL);
ret = clFinish(command_queue);

//Read the memory buffer in <c on the device to the local variable C
int *C = (int*)malloc(sizeof(int)*LIST_SIZE);
ret = clEnqueueReadBuffer(command_queue, c_mem_obj, CL_TRUE, 0, LIST_SIZE*sizeof(int),C,0,NULL,NULL);

//Display the result to the screen
for(i=0;i<LIST_SIZE;i++)
{
    printf("%d + %d = %d\n",A[i],B[i],C[i]);
}

//Clean UP
ret = clFlush(command_queue);
ret = clReleaseKernel(kernel);
ret = clReleaseProgram(program);
ret = clReleaseMemObject(a_mem_obj);
ret = clReleaseMemObject(b_mem_obj);
ret = clReleaseMemObject(c_mem_obj);
ret = clReleaseCommandQueue(command_queue);
ret = clReleaseContext(context);

free(A);
free(B);
free(C);

return 0;
}

这是内核代码: -

__kernel void vector_add(__global int* A,__global int* B,__global int* C)
{
//Get the index of the current work item
int i = get_global_id(0);
//Do the operation
C[i] = A[i] + B[i];
}

如果某人过去遇到类似情况并解决了,请帮助。

0 个答案:

没有答案