A method of sharing memory semantics between a central processing unit "CPU" and a graphics processing unit "GPU" including allowing pointers to be passed and data structures to be shared between the CPU and GPU, the method characterised by: partitioning address space into a shared physical memory that is accessible to both the CPU and GPU and a remaining address space that is private to the CPU and private to the GPU; and determining the CPU and GPU have different page tables and different virtual to physical memory translations, and, in response, synchronising the contents of a virtual address between the CPU and GPU and the contents of different physical memory addresses, wherein the synchronising further comprises: mapping, during initialization, a portion of the shared physical memory into a user space of an application and instantiating the portion of the shared physical memory with a task queue, a message queue and copy buffers; copying pages from the CPU private address space into a respective copy buffer in the shared physical memory, said copy buffer being tagged with a respective virtual address mapped to a first address of the CPU private address space, and said copy buffer being further tagged with an identifier of the process associated with the task; and having the GPU copy from the shared physical memory into an address of the GPU private address space that is associated with the virtual address; and copying pages from the GPU private address space into the shared physical memory and having the CPU access the pages from the shared physical memory into an address of the private CPU address space associated with the virtual address. partitioning address space into a shared physical memory that is accessible to both the CPU and GPU and a remaining address space that is private to the CPU and private to the GPU; and determining the CPU and GPU have different page tables and different virtual to physical memory translations, and, in response, synchronising the contents of a virtual address between the CPU and GPU and the contents of different physical memory addresses, wherein the synchronising further comprises: mapping, during initialization, a portion of the shared physical memory into a user space of an application and instantiating the portion of the shared physical memory with a task queue, a message queue and copy buffers; copying pages from the CPU private address space into a respective copy buffer in the shared physical memory, said copy buffer being tagged with a respective virtual address mapped to a first address of the CPU private address space, and said copy buffer being further tagged with an identifier of the process associated with the task; and having the GPU copy from the shared physical memory into an address of the GPU private address space that is associated with the virtual address; and copying pages from the GPU private address space into the shared physical memory and having the CPU access the pages from the shared physical memory into an address of the private CPU address space associated with the virtual address. mapping, during initialization, a portion of the shared physical memory into a user space of an application and instantiating the portion of the shared physical memory with a task queue, a message queue and copy buffers; copying pages from the CPU private address space into a respective copy buffer in the shared physical memory, said copy buffer being tagged with a respective virtual address mapped to a first address of the CPU private address space, and said copy buffer being further tagged with an identifier of the process associated with the task; and having the GPU copy from the shared physical memory into an address of the GPU private address space that is associated with the virtual address; and copying pages from the GPU private address space into the shared physical memory and having the CPU access the pages from the shared physical memory into an address of the private CPU address space associated with the virtual address.