A memory model describes how threads interact through memory and their shared use of data.
It allows compiler to perform important optimizations, such as loop fusion, which can influence the order of read and write operations of potentially shared variables.