OpenMPI 0.1.1

- Main Page
- Related Pages
- Modules
- Data Structures
- Files

- File List
- Globals

Data Structures | Macros | Typedefs | Enumerations | Functions
atomic.h File Reference

Atomic operations. More...

`#include "opal_config.h"`
`#include "opal/sys/architecture.h"`
`#include "opal/sys/atomic_impl.h"`

Go to the source code of this file.

## Data Structures
struct | opal_atomic_lock_t
| Volatile lock object (with optional padding). More...

## Macros
#define | OMPI_GCC_INLINE_ASSEMBLY OPAL_C_GCC_INLINE_ASSEMBLY
#define | OMPI_DEC_INLINE_ASSEMBLY OPAL_C_DEC_INLINE_ASSEMBLY
#define | OMPI_XLC_INLINE_ASSEMBLY OPAL_C_XLC_INLINE_ASSEMBLY
#define | OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER 0
#define | OPAL_HAVE_INLINE_ATOMIC_CMPSET_32 0
#define | OPAL_HAVE_INLINE_ATOMIC_CMPSET_64 0
#define | OPAL_HAVE_INLINE_ATOMIC_ADD_32 0
#define | OPAL_HAVE_INLINE_ATOMIC_SUB_32 0
#define | OPAL_HAVE_INLINE_ATOMIC_ADD_64 0
#define | OPAL_HAVE_INLINE_ATOMIC_SUB_64 0
#define | OPAL_HAVE_INLINE_ATOMIC_SWAP_32 0
#define | OPAL_HAVE_INLINE_ATOMIC_SWAP_64 0
#define | OPAL_HAVE_ATOMIC_SPINLOCKS (OPAL_HAVE_ATOMIC_CMPSET_32 || OPAL_HAVE_ATOMIC_CMPSET_64)
#define | OPAL_NEED_INLINE_ATOMIC_SPINLOCKS
#define | OPAL_HAVE_ATOMIC_MATH_32 OPAL_HAVE_ATOMIC_CMPSET_32
#define | OPAL_HAVE_ATOMIC_MATH_64 0
#define | OPAL_HAVE_ATOMIC_MATH_64 OPAL_HAVE_ATOMIC_CMPSET_64
#define | opal_atomic_cmpset(ADDR, OLDVAL, NEWVAL)
| Atomic compare and set of pointer with relaxed semantics. More...
#define | opal_atomic_cmpset_acq(ADDR, OLDVAL, NEWVAL)
| Atomic compare and set of pointer with acquire semantics. More...
#define | opal_atomic_cmpset_rel(ADDR, OLDVAL, NEWVAL)
| Atomic compare and set of pointer with release semantics. More...
#define | opal_atomic_add(ADDR, VALUE)
| Atomically increment the content depending on the type. More...
#define | opal_atomic_sub(ADDR, VALUE)
| Atomically decrement the content depending on the type. More...

## Typedefs
typedef struct opal_atomic_lock_t | opal_atomic_lock_t

## Enumerations
enum | { OPAL_ATOMIC_UNLOCKED = 0, OPAL_ATOMIC_LOCKED = 1 }
| Enumeration of lock states.

## Functions
void | opal_atomic_mb (void)
| Memory barrier. More...
void | opal_atomic_rmb (void)
| Read memory barrier. More...
void | opal_atomic_wmb (void)
| Write memory barrier. More...
static void | opal_atomic_init (opal_atomic_lock_t *lock, int32_t value)
| Initialize a lock to value. More...
static int | opal_atomic_trylock (opal_atomic_lock_t *lock)
| Try to acquire a lock. More...
static void | opal_atomic_lock (opal_atomic_lock_t *lock)
| Acquire a lock by spinning. More...
static void | opal_atomic_unlock (opal_atomic_lock_t *lock)
| Release a lock. More...
int | opal_atomic_cmpset_32 (volatile int32_t *addr, int32_t oldval, int32_t newval)
int | opal_atomic_cmpset_acq_32 (volatile int32_t *addr, int32_t oldval, int32_t newval)
int | opal_atomic_cmpset_rel_32 (volatile int32_t *addr, int32_t oldval, int32_t newval)
int | opal_atomic_cmpset_64 (volatile int64_t *addr, int64_t oldval, int64_t newval)
int | opal_atomic_cmpset_acq_64 (volatile int64_t *addr, int64_t oldval, int64_t newval)
int | opal_atomic_cmpset_rel_64 (volatile int64_t *addr, int64_t oldval, int64_t newval)
int32_t | opal_atomic_add_32 (volatile int32_t *addr, int delta)
int32_t | opal_atomic_sub_32 (volatile int32_t *addr, int delta)
int64_t | opal_atomic_add_64 (volatile int64_t *addr, int64_t delta)
int64_t | opal_atomic_sub_64 (volatile int64_t *addr, int64_t delta)
static size_t | opal_atomic_add_size_t (volatile size_t *addr, int delta)
static size_t | opal_atomic_sub_size_t (volatile size_t *addr, int delta)
static int | opal_atomic_cmpset_xx (volatile void *addr, int64_t oldval, int64_t newval, size_t length)
static int | opal_atomic_cmpset_acq_xx (volatile void *addr, int64_t oldval, int64_t newval, size_t length)
static int | opal_atomic_cmpset_rel_xx (volatile void *addr, int64_t oldval, int64_t newval, size_t length)
static int | opal_atomic_cmpset_ptr (volatile void *addr, void *oldval, void *newval)
static int | opal_atomic_cmpset_acq_ptr (volatile void *addr, void *oldval, void *newval)
static int | opal_atomic_cmpset_rel_ptr (volatile void *addr, void *oldval, void *newval)
static void | opal_atomic_add_xx (volatile void *addr, int32_t value, size_t length)
static void | opal_atomic_sub_xx (volatile void *addr, int32_t value, size_t length)

## Detailed Description

Atomic operations.

This API is patterned after the FreeBSD kernel atomic interface (which is influenced by Intel's ia64 architecture). The FreeBSD interface is documented at

http://www.freebsd.org/cgi/man.cgi?query=atomic&sektion=9

Only the necessary subset of functions are implemented here.

The following #defines will be true / false based on assembly support:

- `OPAL_HAVE_ATOMIC_MEM_BARRIER` atomic memory barriers
- `OPAL_HAVE_ATOMIC_SPINLOCKS` atomic spinlocks
- `OPAL_HAVE_ATOMIC_MATH_32` if 32 bit add/sub/cmpset can be done "atomicly"
- `OPAL_HAVE_ATOMIC_MATH_64` if 32 bit add/sub/cmpset can be done "atomicly"

Note that for the Atomic math, atomic add/sub may be implemented as C code using opal_atomic_cmpset. The appearance of atomic operation will be upheld in these cases.

## Macro Definition Documentation

#define opal_atomic_add | ( |  | ADDR,
|  |  | VALUE
| ) |  |

Value:
opal_atomic_add_xx( (volatile void*)(ADDR), (int32_t)(VALUE), \
sizeof(*(ADDR)) )

Atomically increment the content depending on the type.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
  This macro should only be used for integer types.

Parameters

  addr | Address of <TYPE>
  delta | Value to add (converted to <TYPE>).

Referenced by mca_coll_sm_barrier_intra(), opal_list_insert(), and opal_progress().

#define opal_atomic_cmpset | ( |  | ADDR,
|  |  | OLDVAL,
|  |  | NEWVAL
| ) |  |

Value:
opal_atomic_cmpset_xx( (volatile void*)(ADDR), (intptr_t)(OLDVAL), \
(intptr_t)(NEWVAL), sizeof(*(ADDR)) )

Atomic compare and set of pointer with relaxed semantics.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
  This macro should only be used for integer types.

Parameters

  addr | Address of <TYPE>.
  oldval | Comparison value <TYPE>.
  newval | New value to set if comparision is true <TYPE>.

See opal_atomic_cmpset_* for pseudo-code.

#define opal_atomic_cmpset_acq | ( |  | ADDR,
|  |  | OLDVAL,
|  |  | NEWVAL
| ) |  |

Value:
opal_atomic_cmpset_acq_xx( (volatile void*)(ADDR), (int64_t)(OLDVAL), \
(int64_t)(NEWVAL), sizeof(*(ADDR)) )

Atomic compare and set of pointer with acquire semantics.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
  This macro should only be used for integer types.

Parameters

  addr | Address of <TYPE>.
  oldval | Comparison value <TYPE>.
  newval | New value to set if comparision is true <TYPE>.

See opal_atomic_cmpset_acq_* for pseudo-code.

#define opal_atomic_cmpset_rel | ( |  | ADDR,
|  |  | OLDVAL,
|  |  | NEWVAL
| ) |  |

Value:
opal_atomic_cmpset_rel_xx( (volatile void*)(ADDR), (int64_t)(OLDVAL), \
(int64_t)(NEWVAL), sizeof(*(ADDR)) )

Atomic compare and set of pointer with release semantics.

This macro detect at compile time the type of the first argument and choose the correct function to b

Note
  This macro should only be used for integer types.

Parameters

  addr | Address of <TYPE>.
  oldval | Comparison value <TYPE>.
  newval | New value to set if comparision is true <TYPE>.

See opal_atomic_cmpsetrel_* for pseudo-code.

#define opal_atomic_sub | ( |  | ADDR,
|  |  | VALUE
| ) |  |

Value:
opal_atomic_sub_xx( (volatile void*)(ADDR), (int32_t)(VALUE), \
sizeof(*(ADDR)) )

Atomically decrement the content depending on the type.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
  This macro should only be used for integer types.

Parameters

  addr | Address of <TYPE>
  delta | Value to substract (converted to <TYPE>).

## Function Documentation

static void opal_atomic_init | ( | opal_atomic_lock_t * | lock,
|  | int32_t | value
| ) |  |
| inline static

Initialize a lock to value.

Parameters

  lock | Address of the lock
  value | Initial value to set lock to

Referenced by opal_progress_init(), and orte_locks_init().

static void opal_atomic_lock | ( | opal_atomic_lock_t * | lock | ) |
| inline static

Acquire a lock by spinning.

Parameters

  lock | Address of the lock.

Referenced by mca_btl_sm_component_progress(), mca_btl_smcuda_component_progress(), opal_class_initialize(), opal_progress_finalize(), opal_progress_register(), and opal_progress_unregister().

void opal_atomic_mb | ( | void |  | ) |

Memory barrier.

Will use system-specific features to instruct the processor and memory controller that all writes and reads that have been posted before the call to `opal_atomic_mb()` must appear to have completed before the next read or write.

Note
  This can have some expensive side effects, including flushing the pipeline, preventing the cpu from reordering instructions, and generally grinding the memory controller's performance. Use only if you need both read and write barriers.

void opal_atomic_rmb | ( | void |  | ) |

Read memory barrier.

Use system-specific features to instruct the processor and memory conrtoller that all reads that have been posted before the call to `opal_atomic_rmb()` must appear to have been completed before the next read. Nothing is said about the ordering of writes when using `opal_atomic_rmb()`.

Referenced by mca_btl_sm_add_procs(), mca_btl_smcuda_add_procs(), and mca_mpool_grdma_evict().

static int opal_atomic_trylock | ( | opal_atomic_lock_t * | lock | ) |
| inline static

Try to acquire a lock.

Parameters

  lock | Address of the lock.

Returns
  0 if the lock was acquired, 1 otherwise.

Referenced by orte_finalize().

static void opal_atomic_unlock | ( | opal_atomic_lock_t * | lock | ) |
| inline static

Release a lock.

Parameters

  lock | Address of the lock.

Referenced by mca_btl_sm_component_progress(), mca_btl_smcuda_component_progress(), opal_class_initialize(), opal_progress_finalize(), opal_progress_register(), and opal_progress_unregister().

void opal_atomic_wmb | ( | void |  | ) |

Write memory barrier.

Use system-specific features to instruct the processor and memory conrtoller that all writes that have been posted before the call to `opal_atomic_wmb()` must appear to have been completed before the next write. Nothing is said about the ordering of reads when using `opal_atomic_wmb()`.

Referenced by mca_btl_sm_add_procs(), mca_btl_smcuda_add_procs(), mca_coll_sm_bcast_intra(), and mca_mpool_grdma_evict().