2017-12-19 19 views
0

문자열을 OpenCL 커널에 전달하려고합니다. 커널에 대한OpenCL 커널에 std :: string 전달

std::string a = "abcd"; 
char *aChar = new char[a.size()+1]; 
aChar[a.size()] = 0; 
memcpy(aChar, a.c_str(), a.size()); 

cl::Buffer serverKeyBuffer(context, CL_MEM_READ_ONLY | CL_MEM_HOST_READ_ONLY, sizeof(char) * a.size(), aChar); 

서명은 다음과 같습니다 :

__kernel void MyKernel(__global float* rollNumber, __global char* a) 

나는 -51 (CL_INVALID_ARG_SIZE를) 점점 계속 여기에 약식 내 C++ 코드입니다. 크기가 유효하지 않은 이유를 정확히 알지 못합니다.

+0

어떤 API 호출이 오류 코드를 반환하고 있습니까? – Dithermaster

+0

은 아마도'CL_MEM_COPY_HOST_PTR'을 사용할 것입니다. 문자열을'std :: string' 밖으로 복사 할 필요도 없습니다. – tmlen

+0

@Dithermaster'kernel.setArg' 호출 – atr07

답변

1

setArg으로 올바르게 전달하고 있습니까? 버퍼 인수 (arg_size 매개 변수 clSetKernelArg)를 전달하는 올바른 길이는 sizeof(cl_mem) (보통 == sizeof (void *))이며 버퍼의 기본 저장소 크기는 아닙니다. 불행히도 나는 C++ API에 대해 많이 알지 못하며 인수를 처리하는 방법을 알고있다 ...

+0

예'setArg'에'serverKeyBuffer'를 넘깁니다. C++ 래퍼'setArg'는'clSetKernelArg'를 래핑합니다. 그래서 그것은'clSetKernelArg (kernel, 0, sizeof (cl_mem), aChar)'와 같은 것이 될 것입니다. – atr07

0

제대로 작동한다. 나는 이것을 버퍼로 전달하지 않는다는 것을 깨달았다. 다음은 고정 코드입니다.

std::string a = "abcd"; 
char *aChar = new char[a.size()+1]; 
aChar[a.size()] = 0; 
memcpy(aChar, a.c_str(), a.size()); 

cl::Buffer serverKeyBuffer(context, CL_MEM_READ_ONLY, strlen(aChar), NULL); 
kernel.setArg(1, serverKeyBuffer); 

... 

queue.enqueueWriteBuffer(serverKeyBuffer, CL_TRUE, 0, strlen(aChar), aChar);