2016-07-30 3 views
2

ARM 인 텐트에는 크기가 다른 스칼라를 추출하는 함수가 포함되어 있습니다. 기능은 ARM® C Language Extensions에서 가장 완전하게 설명되어 있습니다 :vgetq_lane_u64 (x, 0) vget_low_u64 (x)

ET vgetQ_lane_ST(T vec, const int lane); 

는 입력 벡터의 지정된 차선에서 값을 가져옵니다. 내장 함수는 입니다.

그리고 :

T vget_high_ST(T2 a); 
T vget_low_ST(T2 a); 

는 128 비트 벡터의 높은 또는 낮은 반을 가져옵니다. 24 내장 프로그램이 있습니다.

일부 상황에서는 동일한 점을 알고 있습니다. 예를 들어, 리틀 엔디안 시스템에서, 다음은 64 비트 값 마찬가지 :

유사한 등가 높은 차선 존재
uint64x2_t x = ...; 
vgetq_lane_u64(x, 0) == vget_low_u64(x); 

:

uint64x2_t x = ...; 
vgetq_lane_u64(x, 1) == vget_high_u64(x); 

내 질문은은 무엇인가 두 함수가 스칼라를 반환하기 때문에 실제적인 차이점이 있습니까? 한 쪽이 다른 쪽보다 선호되어야합니까?

+0

'리틀 엔디안 머신에서'는 아마도 관련이 없습니다. 왜냐하면 어떤 시점에서도 배열을 인덱싱하지 않기 때문입니다. 벡터 레지스터의 인덱싱 요소는 스칼라 레지스터에서 정수의 왼쪽/오른쪽 교대와 같습니다. 나는 보지 않았지만 endianness에서 실행될 수있는 아키텍처가 벡터를 뒤섞거나 벡터에 스칼라를 삽입/추출하는 지침의 동작을 변경하지 않는다고 가정합니다. (물론 스칼라가 메모리에서 오는 경우, 엔디안은 스칼라 내의 바이트 순서에 중요하지만 벡터 내의 요소 위치는 중요하지 않습니다.) –

답변

4

구현의 세부 사항을 중첩한다고 생각합니다. "... 두 함수 모두 스칼라를 반환하기 때문에"심지어 처음에는 사실이 아닙니다. vgetq_lane_u64()은 스칼라 인 uint64_t을 반환합니다. vget_low_u64()은 단위 길이 벡터 인 uint64x1_t을 반환합니다. 이 사람도 존재한다는 것을 고려하십시오

uint64_t vget_lane_u64(uint64x1_t v, const int lane) 

의미 론적으로, 당신은 벡터 연산에서 Q 레지스터 출력이 곳 vget_{high,low}을 사용하고, D 레지스터에 대한 자세한 벡터 연산으로 데이터를 전달하는 데 분할해야합니다. 실제로을 사용하면 단일 값을 추출하여 스. 라 코드로 전달할 수 있습니다. 단위 길이 벡터 형식과 스칼라 형식 간의 암시 적 변환은 실제로 어느 곳에서나 보장되지 않으므로 확실히 의존하지는 않을 것이라고 확신합니다.

+0

* ""... 두 함수가 모두 스칼라를 반환하기 때문에 " 사실 ... "* - 아, 맞아. 나는 그 세부 사항을 놓쳤다. 'uint64_t'와'uint64x1_t' 사이를 경고없이 변환하기 때문에 GCC와 Clang이 대부분 수용하고있는 것 같습니다. – jww

+0

원래 차이점은 빅 엔디안과 리틀 엔디안간에 쉽게 이동할 수 있다고 생각했습니다. 즉, 차선 번호를 # 정의하고 빅 - 리틀 엔디안에 따라 정의를 변경할 수 있습니다. – jww

+2

@jww [GCC 벡터 확장] (https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html#Vector-Extensions) ([Clang과 유사] (http : //clang.llvm. org/docs/LanguageExtensions.html # vectors-and-extended-vectors)) - NEON 유형 덕분에 끔찍한 일로 도망 갈 수 있습니다. – Notlikethat

관련 문제