原文链接
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. 转 使用utl_http获取某个http页面内容

    #########1.ACL详细解释: 11g 对于XDB  UTL_HTTP or others package 的权限管控进一步加强,如果需要使用到XDB 以下包 UTL_TCP, UTL_SMT ...

  2. 从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!

    一个完整的程序,在内存中的分布情况如下: 具体分布图     自己看书去!!!!!1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区.会随着作用于退出而释放空间.3.堆区:程序员分配并 ...

  3. tomcat正常关闭,端口号占用解决 StandardServer.await: create[8005]:

    cmd进入依次输入以下三个命令 1:netstat -ano | findstr "8005"2:tasklist | findstr "5632" 3:tas ...

  4. 解决ajax提交中文数据乱码

    function replaceWord(date,wordurl){                $.ajax({            url : 'wordReplace',          ...

  5. 晶振电路的设计-AN2867学习

    一 石英晶体的等效电路.带宽: FS~FA之间就是并联带宽,越窄稳定性越好.其中Fs.Fa为Lm/Rm/Cm电抗分别为0和无穷大时的谐振频率).Fp为工作频率(通过调整负载电容CL来达到中心频率) 起 ...

  6. sql查询约束

    写作业的时候发现书上竟然找不到查询约束的语句,百度搜了好久的资料,终于查询成功,在这里记录下来 主键约束 SELECT   tab.name AS [表名],   idx.name AS [主键名称] ...

  7. Python 科学工具使用

    Python 科学工具笔记 numpy a = numpy.array([1,2,3,4]);// 创建一个numpy的数组对象 此时a.shape显示的值为(4,); 由此得出结论在一维的数组中, ...

  8. 管理员账户权限不足 解决方案 类似没有XXX权限之类的问题解决方法

  9. Python函数(3)

    一.装饰器 什么是装饰器,装饰器就是用于拓展原来函数功能的一种函数 装饰器就是用来为被装饰对象添加新功能的工具,装饰器本身可以是任意可调用对象,被装饰的对象也可以是任意可调用对象 装饰器遵循一个关键原 ...

  10. RESTful API设计基本原则

    REST四个基本原则:1.使用HTTP动词:GET POST PUT DELETE:2.无状态连接,服务器端不应保存过多上下文状态,即每个请求都是独立的:3.为每个资源设置URI:4.通过XML JS ...