func (p *exchParam) upload() { // alloc if needed if p.gpu == nil { p.gpu = cuda.SymmLUT(cuda.MemAlloc(int64(len(p.lut)) * cu.SIZEOF_FLOAT32)) } cuda.MemCpyHtoD(unsafe.Pointer(p.gpu), unsafe.Pointer(&p.lut[0]), cu.SIZEOF_FLOAT32*int64(len(p.lut))) p.gpu_ok = true }
func (p *exchParam) upload() { // alloc if needed if p.gpu == nil { p.gpu = cuda.SymmLUT(cuda.MemAlloc(int64(len(p.lut)) * cu.SIZEOF_FLOAT32)) } lut := p.lut // Copy, to work around Go 1.6 cgo pointer limitations. cuda.MemCpyHtoD(unsafe.Pointer(p.gpu), unsafe.Pointer(&lut[0]), cu.SIZEOF_FLOAT32*int64(len(p.lut))) p.gpu_ok = true }
// get an up-to-date version of the lookup-table on GPU func (p *lut) gpuLUT() cuda.LUTPtrs { p.source.update() if !p.gpu_ok { // upload to GPU p.assureAlloc() cuda.Sync() // sync previous kernels, may still be using gpu lut for c := range p.gpu_buf { cuda.MemCpyHtoD(p.gpu_buf[c], unsafe.Pointer(&p.cpu_buf[c][0]), cu.SIZEOF_FLOAT32*NREGION) } p.gpu_ok = true cuda.Sync() //sync upload } return p.gpu_buf }