2012-05-07 3 views
3

에 대한 포인터를 OpenCL 커널 함수에서 타입 변환하는 방법을 알려줄 수 있습니까 ?? ((int*) char_pointer)을 시도했지만 작동하지 않습니다.openCL에서 char *를 int *로 캐스팅하는 방법

+2

어떤 오류가 있습니까? – user1202136

+0

컴파일러에서 엄격한 앨리어싱을 해제했는지 확인하십시오.이 작업은 엄격한 앨리어스 규칙으로 인해 올바르지 않지만 대부분의 컴파일러에서 해제 할 수 있습니다. –

+0

/tmp/OCLqZ3crS.cl(710) : 오류 : 형식 변환이 잘못되었습니다. a [0] = * ((int *) allocatedBuf); allocatedBuf 유형이 글로벌 char * – sahil

답변

10

올바른 주소 공간으로 포인터를 한정해야한다고 생각합니다.

주소 공간을 지정하지 않으면 __private이 사용되지만 소스 포인터는 __global 포인터 (사용자 의견에서) 인 것처럼 보이므로 주소 공간이 호환되지 않습니다.

(int*) 대신 (__global int*)을 사용해보십시오.

+0

고맙습니다 ... 내 문제를 해결했습니다. – sahil

0

물건을 노동 조합의 포인터, 숯불 *로 초기화 INT *와 함께 사용 :

union { 
    char *cp; 
    int *ip; 
} ptr; 

ptr.cp = allocatedBuf; 
a[0] = *(ptr.ip); 

미운하지만, 캐스트없이 트릭, 적어도 C.에서 그것은 정의되지 않은 동작이다 않지만, 심장 모니터 나 다른 쪽 끝의 핵탄두에서 이걸 사용하지 않았습니까?

+1

코드가 공개되고 일부 회사가 원자력 발전소에서 언젠가이를 사용한다면 어떻게 될까요? – hochl

+0

OpenCL C는 명시 적으로 마지막으로 쓰여진 멤버가 아닌 다른 유니온 멤버를 읽을 수 있기 때문에 UB가 아닌 것으로 생각합니다. 이것은 OpenCL C가 기반을 둔 C99에서도 마찬가지 일지 모르지만 그 점은 확실하지 않습니다. 하지만 어쨌든 불일치하는 주소 공간에 누워 있기 때문에 문제가 해결되지 않습니다. –

+0

나는 그들에게 그렇게 말했기 때문에 그들은 나를 비난 할 수 없다. 진지하게, 받아 들여진 대답에서 던지기와 똑같은 일이 일어날 것입니다. 잘못 정렬 된 포인터를 사용하면 항상 문제가 발생합니다. – Jens

관련 문제