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 ...
随机推荐
- g++ -I(大写i) 与-L(大写l)-l(小写l) 的作用与学习
linux 下 g++编译程序时,-I(大写i) 与-L(大写l)-l(小写l) 的作用 作为一个linux入门级使用者,gcc/g++ 的简单操作已经用过多次, 但是有时稍微复杂一点的程序就会使用到 ...
- 牛客网练习赛28A
题目链接:https://www.nowcoder.com/acm/contest/200/A 链接:https://www.nowcoder.com/acm/contest/200/A来源:牛客网 ...
- Django权限1
1.权限,说白了就是你有资格访问这个网址,而别人每一资格:你有资格进行增删改查,而别人只有查的权限 2.新建是3张表: #用户表 class User(models.Model): name = mo ...
- Java基础16-类与对象
1.如何创建一个类 public class Person{ //属性 String name; String genter; int age; //方法 public void eat(){ Sys ...
- 模拟登陆并爬取Github
因为崔前辈给出的代码运行有误,略作修改和简化了. 书上例题,不做介绍. import requests from lxml import etree class Login(object): def ...
- linux上的常用命令
删除目录及文件 (删除tem目录和所有.xml文件) rm -rf tem/ *.xml 复制文件 cp zoo_sample.cfg zoo.cfg 两台机的目录相互拷贝 scp -r apps/ ...
- Hadoop学习笔记(3) Hadoop文件系统二
1 查询文件系统 (1) 文件元数据:FileStatus,该类封装了文件系统中文件和目录的元数据,包括文件长度.块大小.备份.修改时间.所有者以及版权信息.FileSystem的getFileSta ...
- 【PHP】 hash加密
之前对密码进行加密是在JS文件里做的,但是不行,改到PHP文件里进行加密比较安全,于是乎…… [原JS加密代码] var password = sha256_digest(pwd); 后来在网上调查方 ...
- python 在windows下监听键盘按键
python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...
- POJ 1456——Supermarket——————【贪心+并查集优化】
Supermarket Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...