2017-11-03 9 views
0

나는 큰 uint4에 저장된 0에서 255 (각각 8 비트)의 16 개의 인덱스를 가지고 있으며 다른 하나는 ulong [2]에 저장되어있다.OpenCL : uint4 (또는 ulong [2])에서 각 16 개의 uchar 값에 액세스하는 방법은 무엇입니까?

각 개별 8 비트 (uchar) 값에 액세스 할 수 있도록 어떻게 변환 할 수 있습니까?

지금 나는 uint4이 같은 convertion을하고 있어요 :

index1 = myUint4Val.s0  & 0xff; 
index2 = (myUint4Val.s0 >>8) & 0xff; 
... 
index16 =(myUint4Val.s3 >>24) & 0xff; 

다음 내가 좋아하는 사용할 수 있습니다 : 그 >>, & 0xff를 사용하지 선호

value = dataAt[index1]; .... 

을, 이들이기 때문에 추가 작업은 피하고 싶습니다. 당신의 주소를 취할 수

답변

0

내가 원하는 일에 유형 변환에 stucked 해요

하지만 괜찮을 것 같다 uchar8.s0 .. uchar8.s7로 액세스하는 대신

, ... 당신의 myUint4Valuchar*에 결과 포인터를 캐스팅 UCHAR 변수의 배열로 취급 :

uchar* index_array = (uchar*)&myUint4Val; 

value = dataAt[index_array[0]]; 
value = dataAt[index_array[1]]; 

가 또는 당신은 C 스타일 재 해석 캐스트 구조를 할 수있는, 컴파일러 t을 알려줍니다 o 귀하의 myUint4Val의 메모리를 다른 유형으로 취급하십시오 (여기에 유형 크기에주의하십시오). uchar8에 처음 8 개의 색인을 얻으려면 다음을 시도해보십시오. 그러면 올바른 유형의 사본이 만들어집니다. 기본적으로 주소는 &이며 포인터 유형이 원하는 uchar8* 포인터 유형으로 변경되고 포인터가 uchar8 값 유형으로 역 참조됩니다. 나는 이것을 테스트 할 수있는 기회가 없었어요,하지만 일반적인 생각이 도움이되기를 바랍니다 :

uchar8* index = (uchar8*)&myUint4Val; 
value = dataAt[(*index).s0]; 

참고 :

uchar8 index = *((uchar8*)&myUint4Val); // takes first 8 byte 
value = dataAt[index.s0]; 

양자 택일로, 당신은 단지 올바르게 입력 포인터를 만들 수 있습니다. 오픈 CL에서

+0

나는 우리가 C가하는 일 같은 것들을 할 수 있다고 생각하지 않았다 때문에, 나는 적이없는, 기능 예를 들어

as_*() 재 해석이있다 데이터 유형을 변환하는 간단한 방법을 보았습니다. 정보 주셔서 감사합니다 –

0

내가 OpenCL을에 코드를보고

uint16 a = as_uint16(myUint4Val); // now you can use a.s0, a.s01, a.s2 etc 
uint16 b = as_uint16(myUint8Val);