2011-03-02 4 views
0

내 응용 프로그램에 openCL을 사용하고 있으며 함수가 처음 반환 된 후 GPU에서 메모리를 유지하는 방법을 알고 싶습니다. 예. GPU로 100b를 보내고 또 다른 100b를 반환하고 GPU로도 같은 100b를 유지하므로 CPU로 보내지 않아도 다음 반복에서 GPU로 돌아갈 필요가 없습니다.OpenCL- 공유 메모리 액세스

예 : = {2,3,4} 다음에 시간이 좀 FN 전화 나 때문에

은 = {1,2,3}

kernel__ 석회질의 B = A + 1을 보낼 수 있습니다. 그것은,이 추상화 수있는 다시 GPU로 CPU에

감사

답변

0

당신이 CL 버퍼 (cl_mem)에 원하는 데이터를 넣어를 전송하지 않고 내가이 작업을 수행하려면,} (3,4,5를 반환해야합니다 당신은.

0

하는 모습이 코드를 가지고.

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

를 GPU 메모리의 덩어리를 조작하는 그리고 지금은 다른 커널로 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); 

CPU를 절대 통과하지 마십시오.