Доступ к общей памяти OpenCL

Я использую openCL для своего приложения и хотел бы знать, как сохранить память на графическом процессоре после первого возврата функции. т.е. Отправьте 100 байт в GPU, сделайте некоторые вычисления, верните еще 100 байт, а также сохраните те же 100 байт в графическом процессоре, чтобы мне не нужно было отправлять их в ЦП, а затем обратно в ГП на следующей итерации.

Eg.

отправить = {1,2,3}

kernel__ calc b=a+1, поэтому b={2,3,4} в следующий раз, когда я вызову некоторую fn. он должен вернуть (3,4,5}, я хочу сделать это без передачи на процессор, а затем обратно на графический процессор

Спасибо


person aditya    schedule 02.03.2011    source источник


Ответы (2)


Поместите нужные данные в буфер CL (cl_mem), эта абстракция позволяет вам манипулировать фрагментами памяти графического процессора.

person Dr. Snoopy    schedule 02.03.2011

взгляните на этот код.

     imageI= clCreateImage2D(context,CL_MEM_READ_ONLY,&format,img.cols,img.rows,0,0,&err); 
 CHECK_CL_ERROR(err);

 err = clEnqueueWriteImage(queue,imageI,CL_TRUE,origin,region,img.cols*sizeof(uchar),0,img.data,0,NULL,NULL);
 CHECK_CL_ERROR(err);

 imageJ= clCreateImage2D(context,CL_MEM_READ_WRITE,&format,img.cols,img.rows,0,0,&err);
CHECK_CL_ERROR(err);

 err = clEnqueueWriteImage(queue,imageJ,CL_TRUE,origin,region,img.cols*sizeof(uchar),0,img.data,0,NULL,NULL);
 CHECK_CL_ERROR(err);

 cl_kernel gauss = clCreateKernel(program, "gauss",&err);
 CHECK_CL_ERROR(err);

 err = clSetKernelArg(gauss, 0, sizeof(cl_mem), (void*)&imageI);
 CHECK_CL_ERROR(err);
err = clSetKernelArg(gauss, 1, sizeof(cl_mem), (void*)&imageJ);
CHECK_CL_ERROR(err);
 err = clEnqueueNDRangeKernel(queue,gauss,2,NULL,szGlobalWorkSize,szLocalWorkSize,0,NULL,&event);
 CHECK_CL_ERROR(err);

И теперь я переношу imageJ на другое ядро.

Gradient= clCreateImage2D(context,CL_MEM_READ_WRITE,&format,img.cols,img.rows,0,0,&err); 
     CHECK_CL_ERROR(err);

     Angle= clCreateImage2D(context,CL_MEM_READ_WRITE,&format,img.cols,img.rows,0,0,&err);
    CHECK_CL_ERROR(err);

     cl_kernel sobel = clCreateKernel(program, "sobel",&err);
     CHECK_CL_ERROR(err);

     err = clSetKernelArg(sobel, 0, sizeof(cl_mem), (void*)&imageJ);
     CHECK_CL_ERROR(err);
    err = clSetKernelArg(sobel, 1, sizeof(cl_mem), (void*)&Gradient);
    CHECK_CL_ERROR(err);
     err = clSetKernelArg(sobel, 2, sizeof(cl_mem), (void*)&Angle);
    CHECK_CL_ERROR(err);
err = clEnqueueNDRangeKernel(queue,sobel,2,NULL,szGlobalWorkSize,szLocalWorkSize,0,NULL,&event);
     CHECK_CL_ERROR(err);

и никогда не проходят через ЦП.

person crodriguezo    schedule 02.03.2011