cudaMemcpy有四种类型:HostToHost, DeviceToHost, HostToDevice, DeviceToDevices

现在我有两个指针:h_ptr, d_ptr,分别指向host端某数组的起始位置,和device端数组的起始位置。num是h_ptr数组的大小,一开始只有host端存有这个数组。

这两个指针是直接定义在host端的,比如

int *h_ptr;
int *d_ptr;

当我要在Device(也就是GPU)上创建一个d_ptr指向的数组,并把h_ptr数组的值拷贝过去时:

cudaMalloc((void**)&d_ptr, (num) * sizeof(int));  //注意这里是void**
cudaMemcpy(d_ptr, h_ptr,
sizeof(int) * (num), cudaMemcpyHostToDevice);

需要先在GPU上malloc一段内存,然后使用cudaMemcpyHostToDevice指定内存传输方向,把num个int传过去。

那么现在,虽然d_ptr仍然是host端的指针,但它指向的地址是device端的了,我在GPU的kernel function中将d_ptr作为参数传进去,便可以在GPU端通过d_ptr获取数组的值了:

__global__ void kernel_opt(int *d_ptr, int num){
int id = blockIdx.x * blockDim.x + threadIdx.x;
if(id < num)
d_ptr[id] = calc(d_ptr[id]);
// 计算
}

在GPU端计算完毕之后,可能要把数组中新的值传回host端,也就是d_ptrh_ptr,在host端这样操作即可:

cudaMemcpy(h_ptr, d_ptr, sizeof(int) * (num), cudaMemcpyDeviceToHost);

总结:host端只能获取位于host端的内存(比如 h_ptr[0] ),device端只能获取位于device端的内存(比如 d_ptr[0]),如要跨界,使用cudaMemcpy。

cudaMemcpy cudaMalloc的更多相关文章

  1. CUDA内存拷贝

    原文链接1.cudaMemcpy()<--> cudaMalloc()  //线性内存拷贝 1 //线性内存拷贝 2 cudaMalloc((void**)&dev_A, data ...

  2. cudaMemcpy与cudaMemcpyAsync的区别

    转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5231857.html 简单可以理解为:cudaMemcpy是同步的,而cudaMemcpyAsync是异步的 ...

  3. cudaMalloc和cudaMallocPitch

    原文链接 偶有兴趣测试了一下题目中提到的这两个函数,为了满足对齐访问数据,咱们平时可能会用到cudamallocPitch,以为它会带来更高的效率.呵呵,这里给出一段测试程序,大家可以在自己的机器上跑 ...

  4. 如何理解CUDA中的cudaMalloc()的参数

    首先看下此运行时函数的原型: cudaError_t cudaMalloc (void **devPtr, size_t size ); 主要的第一个参数.为什么是两个星星呢?用个例子来说明下. fl ...

  5. CUDA[2] Hello,World

    Section 0:Hello,World 这次我们亲自尝试一下如何用粗(CU)大(DA)写程序 CUDA最新版本是7.5,然而即使是最新版本也不兼容VS2015 ...推荐使用VS2012 进入VS ...

  6. CUDA[1] Introductory

    Section 0 :Induction of CUDA CUDA是啥?CUDA®: A General-Purpose Parallel Computing Platform and Program ...

  7. [CUDA] CUDA to DL

    又是一枚祖国的骚年,阅览做做笔记:http://www.cnblogs.com/neopenx/p/4643705.html 这里只是一些基础知识.帮助理解DL tool的实现. “这也是深度学习带来 ...

  8. CUDA程序设计(一)

    为什么需要GPU 几年前我启动并主导了一个项目,当时还在谷歌,这个项目叫谷歌大脑.该项目利用谷歌的计算基础设施来构建神经网络. 规模大概比之前的神经网络扩大了一百倍,我们的方法是用约一千台电脑.这确实 ...

  9. 计算机系列:CUDA 深入研究

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

随机推荐

  1. docker + Umami + Postgresql 网站访问分析

    1 # docker + Umami + Postgresql 2 # 官方安装文档:https://umami.is/docs/install 3 # 一.创建数据库 4 # 1.创建用户 5 CR ...

  2. Shell 编程基础语法

    # shell脚本 # 如何运行shell脚本 sh test.sh source test.sh ./test.sh # 需要有执行权限 # source和其他两种的区别是.source不会开新进程 ...

  3. SQL Server查询优化

    从上至下优化 看过一篇文章,印象深刻,里面将数据库查询优化分为四个大的方向 使用钞能力--给DB服务器加物理配置,内存啊,CPU啊,硬盘啊,全上顶配 替换存储系统--根据实际的业务情况选择不同的存储数 ...

  4. 【JAVA UI】HarmonyOS 如何使用TinyPinyin类库

    ​  参考资料 前言:TinyPinYin是一个适用于Java和Android.HarmonyOS的快速,低内存的汉字转拼音库.码云地址TinyPinYin,其使用方法已在API讲解中有详细介绍,本文 ...

  5. 100行代码实现一个RISC-V架构下的多线程管理框架

    1. 摘要 本文将基于RISC-V架构和qemu仿真器实现一个简单的多线程调度和管理框架, 旨在通过简单的代码阐明如何实现线程的上下文保存和切换, 线程的调度并非本文的重点, 故线程调度模块只是简单地 ...

  6. JavaScript 异步编程(一):认识异步编程

    前言 "异步"的大规模流行是在 Web 2.0浪潮中,它伴随着 AJAX 席卷了 Web.前端充斥了各种 AJAX 和事件,这些都是典型的异步应用场景.现在的 Web 应用已经不再 ...

  7. 从零开始Blazor Server(12)--编辑菜单

    上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...

  8. [HNOI2010]弹飞绵羊 (平衡树,LCT动态树)

    题面 题解 因为每个点都只能向后跳到一个唯一的点,但可能不止一个点能跳到后面的某个相同的点, 所以我们把它抽象成一个森林.(思考:为什么是森林而不是树?) 子节点可以跳到父节点,根节点再跳就跳飞了. ...

  9. good thing

  10. 如何使用Postman调试HMS Core推送接口?

    HMS Core推送服务支持开发者使用HTTPS协议接入Push服务端.Postman是一款接口测试工具,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果.Postma ...