原文链接
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(&copyParams));
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内存拷贝的更多相关文章

  1. CUDA零内存拷贝 疑问考证

    今天思考了一下CUDA零内存拷贝的问题,感觉在即将设计的程序中会派上用场,于是就查了一下相关信息. 以下是一些有帮助的链接: cuda中的零拷贝用法--针对二维指针 cuda中的零拷贝用法--针对一维 ...

  2. 【CUDA开发】CUDA面内存拷贝用法总结

    [CUDA开发]CUDA面内存拷贝用法总结 标签(空格分隔): [CUDA开发] 主要是在调试CUDA硬解码并用D3D9或者D3D11显示的时候遇到了一些代码,如下所示: CUdeviceptr g_ ...

  3. CUDA -- 内存分配

    CUDA可以认为是一个由软件和硬件构成的并行计算系统,其依赖于GPU的并行计算单元,CUDA有类C的API,方便程序编写.其依赖于CPU和GPU的异构体系,通过在CPU上串行执行环境初始化.内存分配. ...

  4. CUDA 内存统一分析

    CUDA 内存统一分析 关于CUDA 编程的基本知识,如何编写一个简单的程序,在内存中分配两个可供 GPU 访问的数字数组,然后将它们加在 GPU 上. 本文介绍内存统一,这使得分配和访问系统中任何处 ...

  5. emplace_back减少内存拷贝和移动

    --------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...

  6. memcpy内存拷贝及优化策略图解

    一般内存拷贝与优化 代码实现 #include<iostream> usingnamespace std; //不安全的内存拷贝(当源内存地址与目标内存地址重叠时会产生错误) void h ...

  7. C++11如何减少内存拷贝次数

    C++11中出现了很多迷人的特性.例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方. 而C++11最大 ...

  8. c++中内存拷贝函数(C++ memcpy)详解

    原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...

  9. opencv roi resize 会导致内存拷贝产生子图像

    opencv roi区域 resize之后,roi的引用已不是原图的引用,而是内存拷贝产生的子图像. http://blog.csdn.net/qianqing13579/article/detail ...

随机推荐

  1. SpringMVC中RequetContextListener

    来自:https://www.cnblogs.com/softidea/p/7068196.html 零.引言 RequetContextListener从名字结尾Listener来看就知道属于监听器 ...

  2. 5W1H

    WHY   ——为什么做?原因与目标 WHAT ——做什么?目标与内容 WHO   ——谁去做?具体的执行者 WHEN ——什么时间做?执行时间 WHERE——在什么地方做?执行地点 HOW——怎样做 ...

  3. [转]分享20佳好玩的 jQuery 游戏

    本文转自:http://www.cnblogs.com/lhb25/archive/2011/04/17/2001089.html jQuery是时下最流行的 JavaScript 库.现在,除了HT ...

  4. XAMPP: Another web server is already running

    nginx 和 xampp 一起使用的时候,如果 nginx先启动,然后 再启动 xampp的时候,就是修改了 http.conf也是会报如果错误 liaohb@ubuntu-xtn->$sud ...

  5. jq案例中遇到的知识点总结(会飞的小鸟和三级联动)

    1.会飞的小鸟 ,按键盘的上下左右键,小鸟会上下左右的飞 知识点:1.keyCode 键盘按键对应的数字 比如 左上右下键 对应 37 38 39 40: 2.小鸟的位置:var bBird=$(&q ...

  6. 创建Brush对象

    在GDI+中,可使用笔刷,以各种个颜色和图像填充图形,GDI+的Brush类本身是一个抽象的类,所以是不能实例化Brush的 但是GDI+的API提供五个类,就扩展了Brush类并提供了具体的实现方式 ...

  7. kafka的分区分配策略

    用过 Kafka 的同学应该都知道,每个 Topic 一般会有很多个 partitions.为了使得我们能够及时消费消息,我们也可能会启动多个 Consumer 去消费,而每个 Consumer 又会 ...

  8. 解决jQuery在chrome中获取height为0

    笔者之前在一家创业公司做过项目,当时遇到这么一个奇怪的问题,我需要用一个jQuery的height()方法获取一个div的高度,但是在chrome浏览器上面有时可以正常获取,但是同一个页面刷新多几次获 ...

  9. 内表转WORD

    组合HTML字符串的方法来导出WORD文件 DATA: BEGIN OF wa_html, zhtml(), END OF wa_html, gt_html LIKE TABLE OF wa_html ...

  10. cookie 的 写入,读取, 删除

    页面跳转,cookie存储参数 1,设置cookie function setCookie(name,value) { var Days = 30; var exp = new Date(); exp ...