2015-01-13 7 views
2

x64 어셈블러에서 작성한 함수를 실행하는 C++ 프로그램을 작성하려고합니다. 조금 더 빠르게 (그리고 CPU 기능과 함께) 속도를 높이고 싶습니다. 따라서 벡터 작업을 사용하기로했습니다.AVX/SSE에서 여러 개의 사인을 얻을 수 있습니까?

문제는 사인을 정수로 곱해야하므로 사인을 먼저 계산해야합니다. SSE/AVX에서이 작업을 수행 할 수 있습니까? 나는 명령어 fsin을 알고 있지만 FPU에있을뿐만 아니라 한 번에 1 개의 사인도 계산합니다. 그래서 나는 FPU에서 밀어 넣고, fsin으로 호출하고, 그것을 FPU에서 메모리로 띄운 다음 AVX 레지스터에 넣어야합니다. 번거롭게 할 가치가없는 것 같습니다.

+0

이 라이브러리를 살펴보십시오. http://gruntthepeon.free.fr/ssemath/ – samgak

+0

전체 정밀도가 필요합니까? –

답변

0

예, SSE/AVX를 사용하는 벡터 버전이 있습니다! 그러나 캐치는 인텔 C++ 컴파일러를 사용해야한다는 것입니다.

이라고합니다 인텔 작은 벡터 수학 라이브러리 (내장) : _mm_sin_pd AVX는 (배정 밀도)하거나 256 비트에 대한

: SSE는 (배정 밀도)를 이용하시기 바랍니다 128 비트에 대한

: _mm256_sin_pd

실제로 두 개의 내장 함수는 손으로 작성한 SSE/AVX 어셈블리로 구성되어 있으며 이제는 4 개의 죄 AVX를 사용하여 한 번에 계산 : =) 대기 시간은 Haswell CPU에서 약 10 클럭 사이클 (정확하게 기억하는 경우)입니다.

덧붙여서, CPU는 워밍업과 피크 퍼포먼스에 도달하기 위해 약 100 개의 내장 함수를 실행할 필요가 있습니다. 단지 몇 가지 죄 함수를 계산해야하는 경우 plain sin()을 대신 사용하는 것이 좋습니다.

행운을 빌어 요 !!

0

SSE/AVX에는 사인 명령이 없습니다. 사용자가 요구하는 정밀도에 따라 Taylor/Madhava series을 사용하는 다항식 또는 Pade Approximant을 사용하는 두 다항식의 지수로 사인 함수에 근사치를 쓸 수 있습니다. 물론 더 많은 다항식 근사법을 사용합니다.

원하는 정밀도와 정확한 속도를 제공하는지 여부는 정확한 문제에 달려 있습니다. 일반적

A + X * (b의 +의 형태로 기록함으로써 하나 이용한 제 n 차 다항식을 평가 N FMA 안내합니다 (Pade 또한 한 분할을 필요로 접근 음) 수있는 매우 빠른 다항식 근사된다 말하기 x * (c + x * (...))).

그러나 사인은 다항식을 사용하여 근사화 될 때 악명이 좋지 않으므로 유스 케이스가 제한적입니다.

+0

intel SVML을 확인하십시오 –

+1

예, SVML은 일을하는 한 가지 방법이지만 명령 집합을 가장하는 라이브러리 일뿐입니다. 나는 OP가 어셈블리 지시만을 사용하여이 문제를 해결하기를 원한다는 가정하에 질문에 답하기로했습니다. – Deleted

+1

예, 교육 목적이 재미 있고 중요하지만 더 중요한 것은 동의합니다. 저자는 "AVX/SSE에서 여러 개의 사인을 얻을 수 있습니까?"라는 해결책을 찾고 있습니다. –