

With respect to Berkeley UPC translator: this will be performed as a blocking operation. Unlike the assignment, whether this is either a `strict` or `relaxed` reference is given in the name of the function, rather than by the type system. Like the assignment (first example) the operation is ordered according to the UPC memory model. `upc_atomic_relaxed(upc_atomic_domain, NULL, UPC_ADD, A+n, &one, NULL)`Īgain, the UPC library specification does not specify this as a blocking or non-blocking operation. With respect to Berkeley UPC specifically: this is semantically always a non-blocking operation, although notably it might be synchronously performed via shared memory when that’s possible (this generally means affinity to the caller or to another thread on the same compute node).ģ. However, it is permitted for the implementation to be synchronous. The performance data shown was obtained using Intrepid GCC UPC 5.2.0 on Intel Xeon processors and Berkeley UPC 2.22.0 with the shared-memory conduit. It is only required to be completed by the corresponding synchronization call. This expresses an explicitly non-blocking transfer that is outside the normal constraints of the memory model. With respect to the Berkeley UPC translator with default (non-experimental) optimizations: this will be performed as a blocking operation.Ģ. Those constraints will depend on whether `A` was declared with the `strict` or `relaxed` qualifier, or the default in effect if neither was used.

The UPC memory model constrains when the implied communication may take place with respect to other operations. Note that unlike OpenSHMEM and MPI, UPC is a language with a dedicated compiler that may or may not optimize communication operations. The UPC language specification does not specify if this is blocking or non-blocking.
