谭升
非主流人工智能科学家 我和外面那些妖艳的货不一样

【CUDA 基础】4.5 使用统一内存的向量加法

使用统一内存的向量加法

本文是前面关于统一内存的补充
参考:https://face2ai.com/CUDA-F-4-2-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/

统一内存矩阵加法

统一内存的基本思路就是减少指向同一个地址的指针,比如我们经常见到的,在本地分配内存,然后传输到设备,然后在从设备传输回来,使用统一内存,就没有这些显式的需求了,而是驱动程序帮我们完成。
具体的做法就是:

使用cudaMallocManaged 来分配内存,这种内存在表面上看在设备和主机端都能访问,但是内部过程和我们前面手动copy过来copy过去是一样的,也就是memcopy是本质,而这个只是封装了一下。

我们来看看完整的代码:

注意我们注释掉的,这就是省去的代码部分、
运行结果:
1-1
就这个代码而言,使用统一内存还是手动控制,运行速度差不多。
这里有一个新概念叫页面故障,我们分配的这个统一内存地址是个虚拟地址,对应了主机地址和GPU地址,当我们的主机访问这个虚拟地址的时候,会出现一个页面故障,当CPU要访问位于GPU上的托管内存时,统一内存使用CPU页面故障来出发设备到CPU的数据传输,这里的故障不是坏掉了,而是一种通信方式,类似于中断。
故障数和传输数据的大小直接相关。
使用

可以查看到实际参数

Advertisements

1-2
也可以使用 nvvp来查看,效果类似。

总结

虽然统一内存管理给我们写代码带来了方便而且速度也很快,但是实验表明,手动控制还是要优于统一内存管理,换句话说,人脑的控制比编译器和目前的设备更有效,所以,为了效率,大家还是手动控制内存吧,把命运掌握在自己手里。

Share

You may also like...

说点什么

avatar
  Subscribe  
提醒

试录了几节线性代数视频课程,欢迎大家支持,
点击试看
点击购买更多内容

由于博客移至wordpress,部分公式和代码显示不正常,博主正在努力修改,如发现公式显示错误,请及时在文章下留言,感谢您的帮助,尽请原谅!