// Frees device memory allocated by MemAlloc(). // It is safe to double-free. func MemFree(p DevicePtr) { if p == DevicePtr(uintptr(0)) { return // Allready freed } err := Result(C.cuMemFree(C.CUdeviceptr(p))) if err != SUCCESS { panic(err) } }
// Returns the base address and size of the allocation (by MemAlloc) that contains the input pointer ptr. func MemGetAddressRange(ptr DevicePtr) (bytes int64, base DevicePtr) { var cbytes C.size_t var cptr C.CUdeviceptr err := Result(C.cuMemGetAddressRange(&cptr, &cbytes, C.CUdeviceptr(ptr))) if err != SUCCESS { panic(err) } bytes = int64(cbytes) base = DevicePtr(cptr) return }
// Copies a number of bytes from device to host. func MemcpyDtoH(dst unsafe.Pointer, src DevicePtr, bytes int64) { err := Result(C.cuMemcpyDtoH(dst, C.CUdeviceptr(src), C.size_t(bytes))) if err != SUCCESS { panic(err) } }
// Asynchronously copies a number of bytes from host to device. // The host memory must be page-locked (see MemRegister) func MemcpyHtoDAsync(dst DevicePtr, src unsafe.Pointer, bytes int64, stream Stream) { err := Result(C.cuMemcpyHtoDAsync(C.CUdeviceptr(dst), src, C.size_t(bytes), C.CUstream(unsafe.Pointer(uintptr(stream))))) if err != SUCCESS { panic(err) } }
// Copies a number of bytes from host to device. func MemcpyHtoD(dst DevicePtr, src unsafe.Pointer, bytes int64) { err := Result(C.cuMemcpyHtoD(C.CUdeviceptr(dst), src, C.size_t(bytes))) if err != SUCCESS { panic(err) } }
// Copies a number of bytes on the current device. // Requires unified addressing to be supported. // See also: MemcpyDtoD(). // TODO(a): is actually an auto copy for device and/or host memory func Memcpy(dst, src DevicePtr, bytes int64) { err := Result(C.cuMemcpy(C.CUdeviceptr(dst), C.CUdeviceptr(src), C.size_t(bytes))) if err != SUCCESS { panic(err) } }
// Returns the physical memory type that ptr addresses. func PointerGetAttributeMemoryType(ptr DevicePtr) (t MemoryType, err Result) { var typ uint64 // foresee enough memory just to be safe err = Result(C.cuPointerGetAttribute(unsafe.Pointer(&typ), C.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, C.CUdeviceptr(uintptr(ptr)))) return MemoryType(uint(typ)), err }
// Asynchronously copies from device memory in one context (device) to another. func MemcpyPeerAsync(dst DevicePtr, dstCtx Context, src DevicePtr, srcCtx Context, bytes int64, stream Stream) { err := Result(C.cuMemcpyPeerAsync(C.CUdeviceptr(dst), C.CUcontext(unsafe.Pointer(uintptr(dstCtx))), C.CUdeviceptr(src), C.CUcontext(unsafe.Pointer(uintptr(srcCtx))), C.size_t(bytes), C.CUstream(unsafe.Pointer(uintptr(stream))))) if err != SUCCESS { panic(err) } }
// Asynchronously sets the first N 32-bit values of dst array to value. func MemsetD8Async(deviceptr DevicePtr, value uint8, N int64, stream Stream) { err := Result(C.cuMemsetD8Async(C.CUdeviceptr(deviceptr), C.uchar(value), C.size_t(N), C.CUstream(unsafe.Pointer(uintptr(stream))))) if err != SUCCESS { panic(err) } }
// Sets the first N 8-bit values of dst array to value. // Asynchronous. func MemsetD8(deviceptr DevicePtr, value uint8, N int64) { err := Result(C.cuMemsetD8(C.CUdeviceptr(deviceptr), C.uchar(value), C.size_t(N))) if err != SUCCESS { panic(err) } }
// Sets the first N 32-bit values of dst array to value. func MemsetD32(dst DevicePtr, value uint32, N int64) { err := Result(C.cuMemsetD32(C.CUdeviceptr(dst), C.uint(value), C.size_t(N))) if err != SUCCESS { panic(err) } }
// Asynchronously copies a number of bytes device host to host. // The host memory must be page-locked (see MemRegister) func MemcpyDtoHAsync(dst HostPtr, src DevicePtr, bytes int64, stream Stream) { err := Result(C.cuMemcpyDtoHAsync(unsafe.Pointer(uintptr(dst)), C.CUdeviceptr(src), C.size_t(bytes), C.CUstream(unsafe.Pointer(uintptr(stream))))) if err != SUCCESS { panic(err) } }