2013-02-02 1 views
0

OpenCL에서 커널 선언시 커널 개체의 주소 나 다른 인수를 커널에서 (커널 인수를 설정하면서) 보낼 수 있습니까? 어떻게 주소는 다음 예에서와 같이 포인터가 아닌 데이터 유형에 할당 할 수 있습니다 :OpenCL 커널에서 전달 된 메모리 개체 및 기타 인수

// 호스트 코드에서 커널 인수를 설정 :

errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &imageObjects[0]); 
errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &imageObjects[1]); 
errNum |= clSetKernelArg(kernel, 2, sizeof(cl_sampler), &sampler); 
errNum |= clSetKernelArg(kernel, 3, sizeof(cl_int), &width); 
errNum |= clSetKernelArg(kernel, 4, sizeof(cl_int), &height); 

// 커널 선언 :

__kernel 무효 gaussian_filter (__read_only image2d_t srcImg, __write_only image2d_t dstImg, sampler_t 샘플러 int width, int height)를

코드 "의 일부이다 I mageFilter "코드는 Google Code의 OpenCl Book Sample에 있습니다.

나는 두 가지 의문이 있습니다 여기에

1) imageObjects [0] 이미 입력 영상의 주소를 포함을, 왜 커널에 & imageObjects [0]을 통과 할 필요가있다? 또한 주소가 전달 된 경우 왜 그들은 포인터로 받아 들여지지 않습니까?

2) args 높이와 너비의 주소는 전달되지만 포인터로 받아 들여지지 않는 args는 없습니다. 컴파일 시간에 주어진다. 왜 그러한 일이 일어나는가?

+0

실제로 문제가 있습니까? 아니면 API의 기술에 대한 설명을 요청하고 계십니까? – Thomas

+0

문제가 있으며 API의 기술적 인 부분인지 여부를 알지 못합니다. OpenCL API와 관련이있다 할지라도 나의 의심을 해결하십시오. 나는 인수가 어떻게 통과해야하는지 알지만, 왜 이런 식으로 전달 될지 모르겠다 ...! – shunya

답변

2

ImageObjects[0]cl_mem 개체입니다. 그것은 입력 이미지의 주소가 아닙니다. clSetKernelArg에 전달하는 것과 커널이 실제로 얻는 것은이 경우에 다릅니다.

크기 및 주소를 사용하는 clSetKernelArg 구문은 동일한 API 호출을 사용하여 모든 유형 (메모리 객체, 샘플러 등의 OpenCL 객체 포함)을 전달할 수 있습니다.

+0

예, imageObjects [0]은 cl_mem 객체라는 것을 알고 있습니다.하지만 입력 이미지가로드 될 때 정확히 무엇이 포함되어 있습니까? (내가 만든 cl_image의 시작 주소를 포함 할 수 있다고 생각) 또한 정확히 cl_mem 개체 무엇입니까? – shunya

+0

cl_mem 개체 표현은 내부적입니다. 그것은 당신이 그것을 만들 때 전달 된 데이터와 일부 장치 특정 정보를 적어도 참조 할 것입니다. –