OpenCL-доступ к общей памяти - PullRequest
0 голосов
/ 02 марта 2011

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

Например.

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

kernel__c calc's b = a + 1, поэтому b = {2,3,4} в следующий раз я позвоню фн. он должен вернуть (3,4,5}, я хочу сделать это без передачи в CPU, а затем обратно в GPU

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 марта 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);

А теперь я передаю изображение J в другое ядро.

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);

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

0 голосов
/ 02 марта 2011

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

...