void memory_t<CUDA>::copyFrom(const void *source, const uintptr_t bytes, const uintptr_t offset){ const uintptr_t bytes_ = (bytes == 0) ? size : bytes; OCCA_CHECK((bytes_ + offset) <= size); if(!isTexture) OCCA_CUDA_CHECK("Memory: Copy From", cuMemcpyHtoD(*((CUdeviceptr*) handle) + offset, source, bytes_) ); else{ if(textureInfo.dim == 1) OCCA_CUDA_CHECK("Texture Memory: Copy From", cuMemcpyHtoA(((CUDATextureData_t*) handle)->array, offset, source, bytes_) ); else{ CUDA_MEMCPY2D info; info.srcXInBytes = 0; info.srcY = 0; info.srcMemoryType = CU_MEMORYTYPE_HOST; info.srcHost = source; info.srcPitch = 0; info.dstXInBytes = offset; info.dstY = 0; info.dstMemoryType = CU_MEMORYTYPE_ARRAY; info.dstArray = ((CUDATextureData_t*) handle)->array; info.WidthInBytes = textureInfo.w * textureInfo.bytesInEntry; info.Height = (bytes_ / info.WidthInBytes); cuMemcpy2D(&info); dev->finish(); } } }
if(mem.data_height > 1) { CUDA_MEMCPY2D param; memset(¶m, 0, sizeof(param)); param.dstMemoryType = CU_MEMORYTYPE_ARRAY; param.dstArray = handle; param.srcMemoryType = CU_MEMORYTYPE_HOST; param.srcHost = (void*)mem.data_pointer; param.srcPitch = mem.data_width*dsize*mem.data_elements; param.WidthInBytes = param.srcPitch; param.Height = mem.data_height; cuda_assert(cuMemcpy2D(¶m)) } else cuda_assert(cuMemcpyHtoA(handle, 0, (void*)mem.data_pointer, size)) cuda_assert(cuTexRefSetArray(texref, handle, CU_TRSA_OVERRIDE_FORMAT)) cuda_assert(cuTexRefSetFilterMode(texref, CU_TR_FILTER_MODE_LINEAR)) cuda_assert(cuTexRefSetFlags(texref, CU_TRSF_NORMALIZED_COORDINATES)) mem.device_pointer = (device_ptr)handle; stats.mem_alloc(size); } else { cuda_pop_context(); mem_alloc(mem, MEM_READ_ONLY); mem_copy_to(mem);
void swanMakeTexture1DEx( const char *modname, const char *texname, size_t width, void *ptr, size_t typesize, int flags ) { int err; // get the texture CUtexref cu_texref; int mode, channels; CUarray array; CUDA_MEMCPY2D copyParam; CUDA_ARRAY_DESCRIPTOR p; // get the module CUmodule mod = swanGetModule( modname ); err = cuModuleGetTexRef(&cu_texref, mod, texname ); if( err != CUDA_SUCCESS) { error( "swanMakeTexture1D failed -- texture not found" ); } p.Width = width; p.Height= 1; mode = flags & TEXTURE_TYPE_MASK; channels = typesize / sizeof(float); switch( mode ) { case TEXTURE_FLOAT: p.Format = CU_AD_FORMAT_FLOAT; p.NumChannels = channels; break; case TEXTURE_INT: p.Format = CU_AD_FORMAT_SIGNED_INT32; p.NumChannels = channels; break; case TEXTURE_UINT: p.Format = CU_AD_FORMAT_UNSIGNED_INT32; p.NumChannels = channels; break; default: error( "swanMakeTexture1D failed -- invalid format" ); } err = cuArrayCreate( &array , &p); if( err != CUDA_SUCCESS) { error( "swanMakeTexture1D failed -- array create failed" ); } memset(©Param, 0, sizeof(copyParam)); copyParam.dstMemoryType = CU_MEMORYTYPE_ARRAY; copyParam.dstArray = array; copyParam.srcMemoryType = CU_MEMORYTYPE_HOST; copyParam.srcHost = ptr; copyParam.srcPitch = width * sizeof(float); copyParam.WidthInBytes = copyParam.srcPitch; copyParam.Height = 1; // err = cuMemcpy2D(©Param); err = cuMemcpyHtoA( array, 0, ptr, typesize * width ); if( err != CUDA_SUCCESS) { error( "swanMakeTexture1D failed -- memcpy failed" ); } err = cuTexRefSetArray ( cu_texref, array, CU_TRSA_OVERRIDE_FORMAT ); if( err != CUDA_SUCCESS) { error( "swanMakeTexture1D failed -- setarray failed" ); } if( (flags & TEXTURE_INTERPOLATE) == TEXTURE_INTERPOLATE ) { err = cuTexRefSetFilterMode( cu_texref, CU_TR_FILTER_MODE_LINEAR ); } else { err = cuTexRefSetFilterMode( cu_texref, CU_TR_FILTER_MODE_POINT ); } if( err != CUDA_SUCCESS) { error( "swanBindToTexture1D failed -- setfiltermode failed" ); } if( (flags & TEXTURE_NORMALISE ) == TEXTURE_NORMALISE ) { err = cuTexRefSetFlags(cu_texref, CU_TRSF_NORMALIZED_COORDINATES); err |= cuTexRefSetAddressMode(cu_texref, 0, CU_TR_ADDRESS_MODE_CLAMP); err |= cuTexRefSetAddressMode(cu_texref, 1, CU_TR_ADDRESS_MODE_CLAMP); if( err != CUDA_SUCCESS) { error( "swanBindToTexture1D failed -- setflags 1 failed" ); } } err = cuTexRefSetFormat( cu_texref, CU_AD_FORMAT_FLOAT, channels ); if( err != CUDA_SUCCESS) { error( "swanBindToTexture1D failed -- setformat failed" ); } //printf("TEX BIND DONE\n"); }