Można jakoś dostosować C++ z VS 2010 żeby było możliwe używanie instrukcji FMA - fast multiply-add?
odejmowanie i dodawanie:
a + cd;
a - cd;
c*d - a;
wystarczy z trzema argumentami, czyli FMA3:
a = a + c*d;
itp.
Można jakoś dostosować C++ z VS 2010 żeby było możliwe używanie instrukcji FMA - fast multiply-add?
odejmowanie i dodawanie:
a + cd;
a - cd;
c*d - a;
wystarczy z trzema argumentami, czyli FMA3:
a = a + c*d;
itp.
A może ktoś wie jak w ogóle działa ten mechanizm intrinsików w VS C++?
Kompilator ma to wbudowane na baton i cześć,
czy też jest to jakoś bardzie sensownie zrobione,
tj. można tu definiować nowe instrukcje, niskopoziomowe - rozkazy procesora?
Z tego co wiem, jedyną możliwością jest wstawka asemblerowa, co da się zrobić tylko w wersji 32-bitowej.
Azarien napisał(a):
Z tego co wiem, jedyną możliwością jest wstawka asemblerowa, co da się zrobić tylko w wersji 32-bitowej.
Tak, ale czy ten kompilator z VS 2010 zna w ogóle rozkazy fma, i inne nowe,
czy też zupełnie maszynowo mam to wstawiać?
Zresztą takie coś jest raczej do kitu, bo iniline wtedy nie działa,
czyli byłaby wołana funkcja, co zniweczyłoby cały zysk szybkości.
x = fms(a,b,c);
sam wrzut na stos tych trzech double to aż 6 instrukcji,
plus call, potem znowu ładowanie tego ze stosu w samej funkcji,
obsługa ramki stosu - pewnie z 20 instrukcji z tego wyjdzie.
A w wersji wektorowej byłoby 3 x po 2 double, więc jeszcze gorzej.
FMA4 w MSVC 2010 SP1: http://msdn.microsoft.com/en-us/library/vstudio/gg445134(v=vs.100).aspx
Wg Wikipedii MSVC 2012 obsługuje też FMA3.
O! Dzięki.
Sprawdziłem to.
struct T3D { double x,y,z; };
struct TPV { T3D r, v; };
void addm(TPV &p, TPV &q, int n, double m)
{
p.r += q.r * m; // trzy składowe
p.v += q.v * m; // też 3 - razem sześć
}
Teraz wektorowo i z fma:
void addmp(TPV &p, TPV &q, int n, double m)
{
__m128d mm = _mm_set1_pd(m);
__m128d a = (__m128d)&p.r, b = (__m128d)&q.r;
a[0] = _mm_macc_pd(b[0], mm, a[0]); // 2
a[1] = _mm_macc_pd(b[1], mm, a[1]); // 2
a[2] = _mm_macc_pd(b[2], mm, a[2]); // i 2 - sześć sztuk
}
I chyba nie działa to szybciej od pierwszej wersji, tylko wyniki są nieco inne.
Dziwne...
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.