2017-04-21 1 views
0

로컬 주소 공간의 OpenCL 커널에 배열을 전달하고 싶습니다. 하지만 CL_invalid_VALUE이 나옵니다.Opencl 커널의 로컬 주소 공간에 배열을 전달하는 방법

int a[]={1,2,3,4,5}; 

로컬 주소 공간에 데이터를 전달하기 위해 버퍼를 만들 필요가 없습니다. 그래서 :

clSetKernelArg(kernel, 21, sizeof(int)*5,a); 

커널

__kernel void abc(__local int *a) 
{} 

을에서 내가 __local__global로 변경하면 모든 것이 잘 작동합니다. 어떻게하는지 말해줘.

+1

'sizeof (int) * 5'를 'sizeof (a)'로 바꾸십시오. – tilz0R

+1

opencl에서는 속도가 향상되지 않지만 지적 메모리의 특성과 위치가 실제로 관련이 있다면, 그런 결정을 내리기에 충분한 정보를 제공하지 못했습니다. 언제나처럼, 우리는 [mcve]를 기대하며, 유용한 답을 얻는 기회는 제공 할 때 크게 향상됩니다. –

답변

1

호스트에서 로컬 메모리로 아무 것도 전달할 수 없습니다.

커널 매개 변수에서 로컬 포인터를 spesifying하는 목적은 런타임시 로컬 버퍼의 크기를 지정하는 것입니다. 그런 다음 clSetKernelArg 호출에서 세 번째 매개 변수는 크기이고 네 번째 매개 변수는 NULL이어야합니다. Documentation

GPU를 사용한다고 가정하면 상수 메모리에 전달하거나, 항상 동일하면 커널의 로컬 메모리를 초기화하거나 전역 메모리로 전달한 다음 커널에서 로컬 메모리를 사용하는 것이 좋습니다 async_work_group_copy.

+0

하지만 호스트에서 개인 메모리로 데이터를 전달할 수 있습니다. 그리고 "Aaftab Munshi, Benedict Gaster, Timothy Mattson"에 의해 "Opencl Programming guide"라는 한 권의 책이 있습니다. - 134, 호스트에서 로컬 메모리로 요소를 전달할 수 있음을 보여줍니다. – anil

+0

나는 당신이 가진 혼란을 해소 할 수있는 답을 편집했습니다. – Jovasa