[英]Porting a function from C to OPENCL
我有這個用 C 編寫的函數:
void SimpleGraphDrawing(unsigned char *image, int dim[2],double range[2][2])
{
for (int j=0;j<dim[1];j++)
for (int i=0;i<dim[0];i++)
{
float x=range[0][0]+(i+0.5)*(range[0][1]-range[0][0])/dim[0];
float y=range[1][0]+(j+0.5)*(range[1][1]-range[1][0])/dim[1];
float val=(x*x+y*y-1);
val=val*val*val-x*x*y*y*y;
image[j*dim[0]+i]=(val>0)*255;
}
}
我想將它移植到 OPENCL。
這是我的新功能:
void SimpleGraphDrawingGPU(OpenCLContext &context, unsigned char *image, int dim[2],double range[2][2])
{
cl_int error;
int blocking = true;
SetConsoleColor(15);
cl_int myKernel = GRAPH_DRAWING;
cl_mem imageKernel = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, dim[0]*dim[1] * sizeof(char), NULL, &error);
cl_mem dimKernel = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, 2*sizeof(int), NULL, &error);
cl_mem rangeKernel = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, 4 * sizeof(double), NULL, &error);
error = clEnqueueWriteBuffer(context.GetCommandQueue(0), imageKernel, blocking, 0, dim[0] * dim[1]* sizeof(int), image, 0, NULL, NULL);
error = clEnqueueWriteBuffer(context.GetCommandQueue(0), dimKernel, blocking, 0, 2*sizeof(int), &dim, 0, NULL, NULL);
error = clEnqueueWriteBuffer(context.GetCommandQueue(0), rangeKernel, blocking, 0, 4 * sizeof(double), &range, 0, NULL, NULL);
error = clSetKernelArg(context.GetKernel(myKernel), 0, sizeof(cl_mem), &imageKernel);
error = clSetKernelArg(context.GetKernel(myKernel), 1, sizeof(cl_mem), &dimKernel);
error = clSetKernelArg(context.GetKernel(myKernel), 2, sizeof(cl_mem), &rangeKernel);
size_t globalWorkSize[1] = { 1024 };
error = clEnqueueNDRangeKernel(context.GetCommandQueue(0), context.GetKernel(myKernel), 1, NULL, globalWorkSize, NULL, 0, NULL, NULL);
error = clReleaseMemObject(imageKernel);
error = clReleaseMemObject(dimKernel);
error = clReleaseMemObject(rangeKernel);
;
}
這也是來自 MyKernels 的函數:
__kernel void GRAPH_DRAWING ()
{
}
輸出真的很奇怪,我不知道如何修復它:“PROGRAM -33”
-33 是無效設備。 您應該觀看此示例以了解它們如何管理和處理 OCL 設備: https : //software.intel.com/en-us/articles/gemm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.