2012-05-18 24 views
8

Zgodnie z dokumentacją, Atomic obsługuje T, który jest typu integralnego, typ wyliczeniowy lub typ wskaźnika. Czy Intel TBB obsługuje oficjalnie platformy typu float/debel? Widziałem kilka poprawek here i Rafa Schietekata here, które mogły/nie mogły zostać włączone do najnowszej wersji 4.0. Z łatek, które przeczytałem, jedyną istotną różnicą, jaką zauważyłem, było dodanie reinterpret_cast z typu całkowitego do float/double. Jeśli ktokolwiek mógłby to wyjaśnić, byłbym wdzięczny. Dzięki!Atomowe doubles/float w Intel TBB

Odpowiedz

1

Możesz łatwo dodać obsługę liczb zmiennoprzecinkowych, budując na liczbach całkowitych 64- i 32-bitowych. Atomowe ładowanie/przechowywanie/wymiana może być zaimplementowane jako bezpośrednie owijarki za pomocą reinterpret_cast, atomowe operacje arytmetyczne mogą być realizowane za pomocą pętli z atomową porównawczą wymianą.

1

C++ 11 obsługuje atomowe pływaki i duble. Funkcje arytmetyczne, takie jak std::atomic_fetch_add, są obsługiwane tylko w przypadku typów integralnych.

Jeśli masz kompilator C++ 11, polecam przejść na std::atomic, więc nie musisz polegać na nieudokumentowanym zachowaniu.

+1

Warto również zauważyć, że funkcje arytmetyczne mogą być łatwo i efektywnie emulowane za pomocą 'std :: atomic'. –

+0

Interesujące. Jaki jest najlepszy sposób na zrobienie tego? Czy to pętla porównania i wymiany? (Pobierz aktualną wartość i spróbuj zamienić ją na nowy wynik.Jeśli się nie powiedzie, ponieważ wartość została zmieniona, spróbuj ponownie.) –

+0

Tak, właśnie tak. –

0

Test dla nie-integralnych typów w test_atomic.cpp został dodany w 2008 (wkrótce po czasie dyskusji z Rafem). W związku z tym, nawet od wczesnego czasu, TBB obsługuje float & double atomics (choć ograniczone tylko do fetch_and_store i compare_and_exchange tylko do odczytu-modyfikacji-zapisu).