CUDA内存拷贝
原文链接
1、cudaMemcpy()<--> cudaMalloc() //线性内存拷贝
1 //线性内存拷贝
2 cudaMalloc((void**)&dev_A, data_size);
3 cudaMemcpy(dev_A, host_A, data_size, cudaMemcpyHostToDevice);
2、cudaMemcpy2D()<-->cudaMallocPitch() //线性内存拷贝

cudaError_t cudaMemcpy2D(
void * dst,
size_t dpitch,
const void * src,
size_t spitch,
size_t width,
size_t height,
enum cudaMemcpyKind kind
)

例:
1 cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height);
2 cudaMemcpy2D( void* dst,size_t dpitch,const void* src,size_t spitch,size_t width,size_t height,enum cudaMemcpyKind kind )
3、cudaMemcpy2DToArray()<-->cudaMallocArray() //(二维)线性内存到2维数组的拷贝

1 cudaError_t cudaMemcpy2DToArray (
2 struct cudaArray * dst,
3 size_t wOffset,
4 size_t hOffset,
5 const void * src,
6 size_t spitch,
7 size_t width,
8 size_t height,
9 enum cudaMemcpyKind kind
10 )

例:

1 void mv(float *y, float *A, float *x, int m, int n)
2 {
3 int blkNum = (m >> 4) + ((m & 15) ? 1 : 0);
4 int height = blkNum << 4;
5 int width = (n & 255) ? (((n >> 8) + 1) << 8) : n;
6 dim3 threads(16, 16);
7 dim3 grid(blkNum, 1);
8 cudaArray *d_A;
9 float *d_x, *d_y;
10
11 cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float4>();
12 cudaMallocArray(&d_A, &channelDesc, width >> 2, height);
13 cudaMemcpy2DToArray(d_A, 0, 0, A, n * sizeof(float), n * sizeof(float), m, cudaMemcpyHostToDevice);
14 cudaBindTextureToArray(texRefA, d_A);
15 cudaMalloc((void **) &d_x, n * sizeof(float));
16 cudaMalloc((void **) &d_y, m * sizeof(float));
17
18 cudaMemcpy(d_x, x, n * sizeof(float), cudaMemcpyHostToDevice);
19 mv_kernel<<< grid, threads >>>(d_y, d_A, d_x, m, n);
20 cudaMemcpy(y, d_y, m * sizeof(float), cudaMemcpyDeviceToHost);
21
22 cudaFree(d_y);
23 cudaFree(d_x);
24 cudaUnbindTexture(texRefA);
25 cudaFreeArray(d_A);
26 }

4、cudaMemcpyToArray()<-->cudaMallocArray() //(1维)线性内存到2维数组的拷贝

1 cudaError_t cudaMemcpyToArray(
2 struct cudaArray * dst,
3 size_t wOffset,
4 size_t hOffset,
5 const void * src,
6 size_t count,
7 enum cudaMemcpyKind kind
8 )

例:

1 void initCudaTexture(float *h_volume, float2 *velocity)
2 {
3 cudaChannelFormatDesc desc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
4
5 cudaMallocArray(&d_volumeArray, &desc, 128, 128);
6
7 cudaMemcpyToArray(d_volumeArray, 0, 0, h_volume, sizeof(float)*128*128, cudaMemcpyDeviceToDevice);
8
9 tex.normalized = true;
10 tex.filterMode = cudaFilterModeLinear;
11 tex.addressMode[0] = cudaAddressModeWrap;
12 tex.addressMode[1] = cudaAddressModeWrap;
13
14 cutilSafeCall(cudaBindTextureToArray(tex, d_volumeArray));
15
16 }

5、cudaMemcpy3D()<-->cudaMalloc3DArray() //(1维)线性内存到3维数组的拷贝

1 cudaError_t cudaMemcpy3D(const struct cudaMemcpy3DParms * p)
2
3 struct cudaExtent {
4 size_t width;
5 size_t height;
6 size_t depth;
7 };
8 struct cudaExtent make_cudaExtent(size_t w, size_t h, size_t d);
9
10 struct cudaPos {
11 size_t x;
12 size_t y;
13 size_t z;
14 };
15 struct cudaPos make_cudaPos(size_t x, size_t y, size_t z);
16
17 struct cudaMemcpy3DParms {
18 struct cudaArray *srcArray;
19 struct cudaPos srcPos;
20 struct cudaPitchedPtr srcPtr;
21 struct cudaArray *dstArray;
22 struct cudaPos dstPos;
23 struct cudaPitchedPtr dstPtr;
24 struct cudaExtent extent;
25 enum cudaMemcpyKind kind;
26 };

例:

1 void initCudaTexture(const uchar *h_volume, cudaExtent volumeSize)
2 {
3 cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<uchar>();
4
5 cutilSafeCall(cudaMalloc3DArray(&d_volumeArray, &channelDesc, volumeSize));
6
7 cudaMemcpy3DParms copyParams = {0};
8 copyParams.srcPtr = make_cudaPitchedPtr((void*)h_volume, volumeSize.width*sizeof(uchar), volumeSize.width, volumeSize.height);
9 copyParams.dstArray = d_volumeArray;
10 copyParams.extent = volumeSize;
11 copyParams.kind = cudaMemcpyHostToDevice;
12 cutilSafeCall(cudaMemcpy3D(©Params));
13
14 tex.normalized = true;
15 tex.filterMode = cudaFilterModeLinear;
16 tex.addressMode[0] = cudaAddressModeWrap;
17 tex.addressMode[1] = cudaAddressModeWrap;
18 tex.addressMode[2] = cudaAddressModeWrap;
19
20 cutilSafeCall(cudaBindTextureToArray(tex, d_volumeArray, channelDesc));
21 }

6、cudaMemcpyToSymbol() //拷贝到常数存储器

1 __constant__ float constData[256];
2 float data[256];
3 cudaMemcpyToSymbol(constData, data, sizeof(data));
4 cudaMemcpyFromSymbol(data, constData, sizeof(data));
5 __device__ float devData; float value = 3.14f;
6 cudaMemcpyToSymbol(devData, &value, sizeof(float));
7 __device__ float* devPointer; float* ptr;
8 cudaMalloc(&ptr, 256 * sizeof(float));
9 cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));

CUDA内存拷贝的更多相关文章
- CUDA零内存拷贝 疑问考证
今天思考了一下CUDA零内存拷贝的问题,感觉在即将设计的程序中会派上用场,于是就查了一下相关信息. 以下是一些有帮助的链接: cuda中的零拷贝用法--针对二维指针 cuda中的零拷贝用法--针对一维 ...
- 【CUDA开发】CUDA面内存拷贝用法总结
[CUDA开发]CUDA面内存拷贝用法总结 标签(空格分隔): [CUDA开发] 主要是在调试CUDA硬解码并用D3D9或者D3D11显示的时候遇到了一些代码,如下所示: CUdeviceptr g_ ...
- CUDA -- 内存分配
CUDA可以认为是一个由软件和硬件构成的并行计算系统,其依赖于GPU的并行计算单元,CUDA有类C的API,方便程序编写.其依赖于CPU和GPU的异构体系,通过在CPU上串行执行环境初始化.内存分配. ...
- CUDA 内存统一分析
CUDA 内存统一分析 关于CUDA 编程的基本知识,如何编写一个简单的程序,在内存中分配两个可供 GPU 访问的数字数组,然后将它们加在 GPU 上. 本文介绍内存统一,这使得分配和访问系统中任何处 ...
- emplace_back减少内存拷贝和移动
--------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...
- memcpy内存拷贝及优化策略图解
一般内存拷贝与优化 代码实现 #include<iostream> usingnamespace std; //不安全的内存拷贝(当源内存地址与目标内存地址重叠时会产生错误) void h ...
- C++11如何减少内存拷贝次数
C++11中出现了很多迷人的特性.例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方. 而C++11最大 ...
- c++中内存拷贝函数(C++ memcpy)详解
原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...
- opencv roi resize 会导致内存拷贝产生子图像
opencv roi区域 resize之后,roi的引用已不是原图的引用,而是内存拷贝产生的子图像. http://blog.csdn.net/qianqing13579/article/detail ...
随机推荐
- 转 mysql front安装与使用教程 mysql 工具
mysql front安装与使用教程 由 kaikai0220 创建,Alma 最后一次修改 2018-04-25 mysql front一款小巧的管理Mysql的应用工具,那么这个工具该如何安装和使 ...
- perf命令
@(Linux基础)[perf命令] perf命令 ---- 简介 Perf是内置于Linux内核源码树中的性能剖析(profiling)工具,它基于事件采样原理,以性能事件为基础,支持针对处理器相关 ...
- [DDD]學習筆記 第15章 精煉(Distillation)
核心領域(Core-Domain) 為了使領域模型成為企業真正的資產, 模型中的關鍵核心部份需要足夠靈活和充分利用來創建應用程序的功能; 簡而言之, 核心領域是系統中最有價值的部份. 濃縮模型, 將最 ...
- dos文件格式转换为Unix文件格式
做linux开发的,一般还是在windows上装个虚拟机,在windows上开发, 所以就会出现dos文件与unix文件格式不一致,当windows上的文件在linux上用的时候,经常在每行的末尾会出 ...
- Linux小知识(1): bash中执行数据库的相关操作
工作中经常会遇到命令行操作数据库或登陆至其他服务器等情况,往往需要通过命令行进入相关的数据库或登陆至相关的服务器,再执行指令操作,因此有没有方法,在命令行或bash脚本中模拟进入数据库或登陆服务器操作 ...
- CheckBox全选、取消全选
关于CheckBox全选取消全选 //全选 $("#SysAllSelectedID").click(function () { $("[name=SysCheckbox ...
- ios 你必须了解的系统定义宏使用
1. UNAVAILABLE_ATTRIBUTE __attribute__((unavailable)) - (instancetype)init UNAVAILABLE_ATTRIBUTE; 告诉 ...
- 国内外著名B2C系统介绍兼比较【收藏版】
一.国内知名B2C系统 1.Shopex国内最大的电子商务系统,有各种辅助工具,php开发,免费但不开源,网店模板众多,较适合有淘宝店的卖家.网址:www.shopex.cn 2.ECshop免费且开 ...
- nopCommerce如何支持MySQL
此方法支持nopCommerce2.4以上版本(缺少的代码,可参照nopCommerce2.6源码) nopCommerce 4.1 如何支持Mysql 请看 Url: http://www.nop ...
- ztree树形图自定义图标在jeecg框架中不显示
有时候工作遇到问题,就会硬着头皮去解决,今天给大家说一个ztree树形图自定义图标在jeecg框架中不显示的解决方法 对于这个问题,官方观法说法是在节点元素中加入icon的字段,然后后跟图标的url, ...