2013-07-06 1 views
0

어떻게 (캐스트) 캐릭터문자열을 cl_uchar *로 변환하는 방법?

char* password = "C & OpenCL is cool"; 

cl_uchar * 

에 그것이 CL-커널 함수

__kernel void foobar(__global const uchar * input_data) {...} 

에 전달하는 변환 할 수 있습니까?

+0

'cl_uchar' 서명되지 않은 char''에 대한 형식 정의가 될 것으로 보인다. 그럼'const cl_uchar * s = (const cl_uchar *) "문자열 리터럴"; –

+0

그러나 opencl은 __constant를 사용하여 상수 주소 공간을 지정합니다. __constant도 const와 동일 할 수 있습니까? –

+0

cl :: Buffer에 오류가 발생합니다. 나는 char * pwd = "C & OpenCL is cool"을 시도했다. cl_uchar * password = (cl_uchar *) &pwd; - 오류는 없지만 const가 아닙니다. 다음 질문은 그것이 const 여야하는지 여부입니다. – marcus

답변

-1

이 경고 'n 개의 오류없이 작동이 :

const char* pwd = "C & OpenCL is cool"; 
cl_uchar * password = (cl_uchar*) &pwd; 
cl::Buffer bufferA(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * keyBytes, password); 
kernel.setArg(0, bufferA); 
+0

경고와 오류없이 작동해야하는 내 답변의 버전과 다른 점은 무엇입니까? 'const char *'에서'cl_uchar *'로의 추가적인 캐스트는 완전히 쓸모가 없습니다. 당신이 생각할 수있는 것과는 대조적으로,이 추가 형 변환은 버퍼에 'const char *'를 직접 넣는 것과 같은 재 해석 캐스트이므로 추가 유형 안전성을 전혀 추가하지 않습니다. –

+0

그것은 소스 코드입니다. – marcus

+0

글쎄, 그래, 그 정당화 및 추가 답변, 그래도, 다른 종료 응답은 이미 정확히 동일한 소스 코드를 가지고 있습니까? 이 사이트는 [포럼이 아닙니다] (http://stackoverflow.com/help)를 기억하십시오. –

2

char 포인터를 OpenCL 커널에 직접 넘길 수는 없습니다. 커널이 그 포인터로 무엇을해야할지 모르기 때문입니다. 커널에서 가지고있는 것은 __global 메모리에 대한 포인터입니다. 그래서 당신이해야 할 일은 OpenCL 버퍼 객체를 생성하고 그 객체에 문자열을 쓰고이 버퍼에 핸들을 커널 인수로 전달하는 것입니다. 이것이 어떻게 수행되는지 잘 모르는 경우 적절한 OpenCL 학습 리소스를 참조하십시오. C는 + +에서는이 비슷한 것 :

cl::Buffer input_buffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, 
         sizeof(cl_uchar) * (strlen(password)+1), password); 
... 
kernel.setArg(0, input_buffer); 

마찬가지로 당신이 실제로 const cl_uchar*char*을 변환하지 않아도 그냥 버퍼에와 OpenCL을 char 지원하는 플랫폼에서 복사하고 이후 및 cl_uchar은 동일한 비트 표현을 갖는 것으로 가정 할 수 있지만, 문자열 리터럴의 경우 처음에는 char* 대신 const char*을 사용해야합니다. 데이터 어쨌든 커널 const하고 문자열이 그 큰 가능성이 아니기 때문에 그런데

, 당신은 __contant 대신 적어도 오래된 하드웨어에 (성능상의 이점을 가질 수있는 메모리 __global의 사용을 고려 할 수 있습니다, 여기서 __constant 메모리는 캐시 된 반면 __global은 캐시되지 않았습니다.

+0

답변 해 주셔서 감사합니다. cl :: buffer 사용은 명확했다. __global 대신 __constant를 사용하면 오류가 발생합니다. ** clBuildProgram : -11 **. – marcus

+0

@marcus 그리고 * *'-11'은 무엇입니까? 그리고 빌드 로그는 무엇을 말합니까? 아마도'__constant const'가 최선의 방법은 아닙니다. –

+0

추가 const없이 __global을 __constant로 변경했습니다. 체크 아웃 할 로그가 없습니다. 오류 -11을 보류하는 데 실패합니다. – marcus

관련 문제