2012-05-18 19 views
8

De acuerdo con la documentación, un atómico admite T que es de tipo integral, tipo de enumeración o un tipo de apuntador. ¿Intel TBB admite flotadores/dobles oficialmente? He visto algunos parches here y Raf Schietekat here, que podrían/​​no haber sido incorporados en la última versión 4.0. De los parches que he leído, la única diferencia importante que noté fue la adición de reinterpret_cast de tipo entero a float/double. Si alguien pudiera aclarar esto, lo agradecería. ¡Gracias!dobles/flotantes atómicos en Intel TBB

Respuesta

1

Puede agregar fácilmente soporte para números de coma flotante que se construyen sobre enteros atómicos de 64 y 32 bits. La carga atómica/almacenamiento/intercambio se puede implementar como envoltorios directos usando reinterpret_cast, las operaciones aritméticas atómicas se pueden implementar usando un bucle con intercambio de comparación atómica.

1

C++ 11 admite flotadores y dobles atómicos. Sin embargo, las funciones aritméticas como std::atomic_fetch_add solo se admiten para tipos integrales.

Si tiene un compilador de C++ 11, le recomendaría cambiar a std::atomic para que no tenga que depender del comportamiento no documentado.

+1

También vale la pena señalar que las funciones aritméticas se pueden emular de forma fácil y eficiente con 'std :: atomic'. –

+0

Interesante. ¿Cuál es la mejor manera de hacerlo? ¿Es un ciclo de comparar y cambiar? (Obtenga el valor actual e intente cambiarlo por el nuevo resultado. Si falla porque se modificó el valor, vuelva a intentarlo) –

+0

Sí, ese es el camino. –

0

La prueba para tipos no integrales en test_atomic.cpp se agregó en 2008 (poco después de la discusión con Raf). Por lo tanto, ya que incluso antes de la fecha de la pregunta, TBB admite float & doble atómica (aunque restringido a fetch_and_store y compare_and_exchange operaciones de lectura-modificación-escritura solamente).