VS 2010 intrinsics fma

0

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 - c
d;
c*d - a;

wystarczy z trzema argumentami, czyli FMA3:
a = a + c*d;
itp.

0

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?

0

Z tego co wiem, jedyną możliwością jest wstawka asemblerowa, co da się zrobić tylko w wersji 32-bitowej.

0
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.

0

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.

0

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...

1 użytkowników online, w tym zalogowanych: 0, gości: 1