2016-08-16 14 views
1
나는 테이블에서 일부 값을로드하고 벡터로를 설정할

: 첫 번째 경우에에 벡터의 네 값을 설정은 ARM의 NEON의 내장 함수와 4 floatx32의 벡터를 설정할 수 없습니다

float32x4_t dest = vdupq_n_f32(a); 

intrinsics 매뉴얼을 읽을 때 매우 분명했습니다.

두 번째 경우에는 벡터의 4 개 값을 테이블과 다른 값으로 설정하십시오. 그에 대한 지시가 없기 때문에이 조금 까다로운, 그래서 나는 다음과 같은 한 : 그것은 고유 아니다

float32x4_t dest = {a3,a2,a1,a0}; 

하지만, 인터넷에서 다른 출판물 및 포럼에 내놓고 나를 위해 유일한 해결책이었다 . 슬프게도 다음 오류가 표시됩니다.

error: expected expression before ‘{’ token 

누구든지 도움을받을 수 있습니까?

+1

어떤 컴파일러를 사용하고 있습니까? 이것은 gcc, clang 등에서 잘 작동 할 것입니다. 일식 화성 –

+0

ARM-gnueabi-GCC 내가 초기화 배열은 다음의 최종 도착 –

답변

4

컴파일러가 gcc 나 clang과 같은 직접 초기화를 지원하지 않으면 (예 : gcc 또는 clang 이외의 것을 사용중인 경우) 명시 적으로 값을로드해야합니다. 첫 번째 예는 표시

const float init[4] = {a3,a2,a1,a0}; 
float32x4_t dest = vld1q_f32(init); 

참고 잘못 될 수 있습니다 - 당신은 (SSE의 _mm_set1_ps 같이) 다음 vdupq_n_f32 같은 것을 사용할 것 같은 값으로 4 개 벡터 요소를 설정하려고하는 경우.

+0

와 –

+0

에로드 채워질 때까지 기다릴 것 같은 .... 다른 모든 지시 사항을 성능을 추구하고있어 아 일반적으로 벡터 초기화 이런 종류의, 한 번만 예를 완료 성능이 중요한 루프가 시작되기 전에 함수의 시작 부분에 있으므로 몇 번이나 반복해도 성능에는 아무런 변화가 없어야합니다. 예를 들어 생성 된 코드를 보면 '_mm_set_ps'를 사용하면 너무 많은 명령어가 생성되는 것을 볼 수 있습니다 (모든 내장 명령어가 단일 명령어로 매핑된다고 속지 마십시오). –

+0

당신은 100 % 맞지만 설정하는 것이 루프에서 여러 번 호출된다는 문제가 있습니다 ... X86 버전에서는 타이밍이 좋지만 ARM 버전에서는 예상대로 아닙니다 ... ARM의 경우 직렬 버전은 훨씬 더 빨리 SIMD 버전이 나에게 혼란 스러웠다. –