2014-03-31 2 views
1

char 배열을 double로 변환하는 함수를 만들고 싶습니다. 커널 내에서이 함수를 호출하고 char 배열에 대한 포인터를 전달합니다. 그러나 문제가있는 것 같습니다. 나는이 1 오류 준다 더블char 배열을 opencl에서 double로 변환하는 방법은 무엇입니까?

double toDouble(uchar* ptr) 
{ 
double value; 
value = *ptr << 56; 
value |= *(ptr+1) << 48; 
value |= *(ptr+2) << 40; 
value |= *(ptr+3) << 32; 
value |= *(ptr+4) << 24; 
value |= *(ptr+5) << 16; 
value |= *(ptr+6) << 8; 
value |= *(ptr+7); 
return value; 
} 

와 비트 연산을 사용할 수 없습니다

이것은 또한 나에게 경고 "카운트> 이동을 준다"이진 표현에 유효하지 않은 피연산자 ('더블'과 '더블') " = 유형의 너비 ".

int 또는 long (같은 기능을 toInt로 만들고 비트 연산 사용)으로 동일한 작업을 수행 할 때 오류가 발생하지 않습니다. 이것은 uchar 배열을 double로 변환하는 정확한 방법입니까?

나는이

double data; 
uchar* dataptr=&data; 
for(int i=0;i<8;i++) 
    dataptr[i]=ptr[i]; //where ptr is the pointer to the uchar array 

을 시도하지만이

+0

두 번째 오류가 발생하면 포인터를 유형 변환해야합니다. 여기에 관련있는 내용이 있습니다. http : // stackoverflow .com/questions/10483445/how-to-type-cast-char-int-in-opencl – brokenfoot

답변

2

의 OpenCL의 대부분은 하드웨어를 제외한 C99 표준을 다음과 "다른 주소 공간이 포인터 사이의 불법 암시 적 변환"나에게 오류를 제공 공급 업체가 부동 소수점 값 및 일부 이상한 점을 지원합니다.

염두에두고 비트 연산자의 C99 표준을 보자. "비트 연산자는 제한된 유형에서만 작동합니다 : int와 char (및 변형 된 int). 일부 캐스팅과 함께 작동하도록 만들 수 있습니다 이 연산자는 비트 시프트 연산자와 함께 비트에 액세스하고 수정할 수 있습니다. " http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/bitwise.html

그렇다면이 의미는 무엇입니까? 비트 연산자를 사용할 수있는 유형의 연산을 수행해야합니다. 또한 동일한 비트 크기인지 확인해야합니다. 64 비트 값인 double을 보자. int 형의 변형 인 long에 대해 비트 연산자를 사용할 수 있으며 64 비트입니다. 이 작업을 한 후에는 double으로 길게 캐스팅해야하며, 그러면 값을 반환 할 수 있습니다. 그래서 코드는 다음과 같이 보일 것입니다 :

long value; 
value = *(ptr) << 56; 
value |= *(ptr+1) << 48; 
value |= *(ptr+2) << 40; 
value |= *(ptr+3) << 32; 
value |= *(ptr+4) << 24; 
value |= *(ptr+5) << 16; 
value |= *(ptr+6) << 8; 
value |= *(ptr+7); 

double value2 = (double)value; 

이것은 잘 동작합니다. 그러나 OpenCL 버전이 어떻게 값을 캐스팅 할 수 있는지 확인해야합니다. 여기에 당신을 시작하기위한 참조가 있습니다. OpenCL 1.2는 새로운 AMD 카드에서 흔히 볼 수 있지만 NVIDIA 카드를 가지고 있다면 1.1 사양을 보게 될 것입니다 : https://www.khronos.org/registry/cl/specs/opencl-1.2.pdf

관련 문제