2013-07-23 2 views
1

최적화를 위해 SSE에서 ARM Neon으로 코드를 변환하려고합니다. 코드의 SSE 명령어의 대부분은 네온과 비슷한 명확한 것을 발견했습니다. 그래도 이러한 문제가 발생했습니다.SSE에서 ARM Neon으로 명령어 변환

result1_shifted = _mm_srli_si128 (result1, 1); 

result=_mm_packus_epi16 (res1,res2); 

_mm_storeu_si128 (p_dest, result); 

도와 주시겠습니까?

+2

SIMD 내장 함수의 1 : 1 변환은 SSE -> Neon에서 잘 작동하지 않습니다. 실제로 스칼라 참조 구현으로 돌아가서 처음부터 Neon에서 구현해야합니다. 사용 가능한 명령어/내장 함수에 더 적합한 더 나은 접근 방법이 종종 있습니다. –

+0

그 방법에 대한 좀 더 구체적인 정보를 제공해 주시겠습니까? 나는 이것을 한 번도 해본 적이 없으며 몇 가지 지침 만 변환하면되지만 정말 어려움을 겪고 있습니다. 감사합니다. – user1926328

+0

두 단계로 수행하십시오 : (1) SSE 코드를 스칼라 형식 (즉, 바로 C 코드)으로 리버스 엔지니어링 한 다음 테스트/벤치 마크/프로파일 링하여 (a) 올바르게 작동하는지 확인하고 (b) 최적화가 필요한 성능 핫스팟입니다. (2) (1b) 코드가 최적화되어야 함을 나타내면 Neon 학습 곡선을 거쳐 Neon SIMD intrinsic 또는 어셈블러를 사용하여 코드를 구현해야합니다. 가능하다면 (2)를 피하는 것이 이상적입니다. –

답변

1

"C"(또는 다른 어떤 것) 참조 디자인으로 돌아가서 처음부터 시작하는 것이 좋습니다. 특히 NEON에는 경우에 따라 작업을 수행하는 최적의 방법이있을 수 있습니다.

_mm_srli_si128 (result1, 1);VEXT.S8 Qdst, SRC2 0으로 삭제되었습니다 Qsrc, Qsrc2, # 1,

_mm_packus_epi16 (res1,res2);VQMOVN.S16을 시도 DDST을보십시오 : 당신은 당신이 거의 동일한 일을 할 필요가 있음을 발견한다면, 여기에 몇 가지 힌트입니다 , Qsrc. 대안을 찾을 때 핵심 단어는 "좁다"입니다. 너는 좁게 움직이고있다. "Q"는 채도에 대한 NEON 명명법입니다. 서명되지 않은 상태로 서명했기 때문에 문제가 발생할 수 있습니다. NEON이 지원하는지 잘 모르겠지만 사용 사례는 괜찮을 수 있습니다. 그렇기 때문에 참조 및 테스트가 좋은 이유입니다.

_mm_storeu_si128 (__m128i *p, __m128i a); 분명히 여기에 VSTM이 있으며 여기에는 많은 옵션이 있습니다. 아마도 좀 더 자세하게 살펴보고 싶을 것입니다.

관련 문제