2012-05-18 13 views
8

In base alla documentazione, un atomico supporta T che è di tipo integrale, tipo di enumerazione o un tipo di puntatore. Il supporto Intel TBB galleggia/raddoppia ufficialmente? Ho visto alcune patch here e da Raf Schietekat here, che potrebbe/non essere stato incorporato nell'ultima versione 4.0. Dalle patch che ho letto, l'unica grande differenza che ho notato è stata l'aggiunta di reinterpret_cast dal tipo intero a float/double. Se qualcuno potesse chiarirlo, lo apprezzerei. Grazie!Doppio atomico/float in Intel TBB

risposta

1

È possibile aggiungere facilmente il supporto per numeri in virgola mobile che si basano su numeri interi atomici a 64 e 32 bit. Carichi/depositi/scambi atomici possono essere implementati come wrapper diretti usando reinterpret_cast, le operazioni aritmetiche atomiche possono essere implementate usando un ciclo con scambio di confronto atomico.

1

C++ 11 supporta i galleggianti atomici e i doppi. Le funzioni aritmetiche come std::atomic_fetch_add sono supportate solo per i tipi interi, tuttavia.

Se si dispone di un compilatore C++ 11, si consiglia di passare a std::atomic in modo da non dover fare affidamento su comportamenti non documentati.

+1

Vale anche la pena notare che le funzioni aritmetiche possono essere emulate facilmente ed efficientemente con 'std :: atomic'. –

+0

Interessante. Qual'è il miglior modo di farlo? È un ciclo di confronto e scambio? (Recupera il valore corrente e prova a scambiarlo con il nuovo risultato. Se fallisce perché il valore è stato modificato, riprova.) –

+0

Sì, è così. –

0

Il test per i tipi non integrali in test_atomic.cpp è stato aggiunto nel 2008 (subito dopo la discussione con Raf). Quindi, anche in anticipo rispetto al tempo della domanda, TBB supporta la doppia atomica fluttuante & (sebbene limitata solo alle operazioni fetch_and_store e compare_and_exchange read-modify-write).