前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在cuda的核函数中可以按地址调用普通变量么?

在cuda的核函数中可以按地址调用普通变量么?

作者头像
GPUS Lady
发布2018-04-13 15:04:06
3.1K0
发布2018-04-13 15:04:06
举报
文章被收录于专栏:GPUS开发者GPUS开发者

请问在cuda的核函数中可以按地址调用普通变量么?

GPU世界论坛 bbs.gpuworld.cn

Hi, 楼主, 完全无问题,从Fermi起引入卡内统一编址(Generic Addressing)和卡间统一编址(UVA ) 开始,就毫无压力了,这都8年过去了。 但需要注意这个问题: (1)最终指向global memory地址空间的指针,可以在本次kernel启动,或者下次kernel启动的任何线程中都是有效的。 (2)最终指向local memory的指针,仅在本次kernel启动的本线程中有效。如果错误的在本次kernel启动的本block中的其他线程使用,则自动得到被替换成对应的线程的对应local memory位置的值。 (3)最终指向shared memory的指针,仅在本次kernel启动的本block中的任意一个线程中有效。 另外两点需要注意的: (4)在部分平台支持P2P Access的情况下,则指向一张卡的global memory的指针,可以在另外一张卡上的kernel中被使用,类似情况(1)。 (5)当global memory实际由内存映射而成,这这种global memory,具有比普通的显存构成的global memory慢一些的访问性能。但从程序的角度看,两者并无逻辑上的区别,但在使用的时候可能会导致一次或者多次的自动跨PCI-E传输(参考手册上的zero-copy memory之类的章节). 从Kepler+开始,对卡间的统一编址做了进一步的加强,并命名为Unified Memory / Managed Memory. 此时这种内存空间上的寻址可以: (1)增强为CPU也能访问他们,哪怕某段时间实质的存储后备介质并非内存(自动page fault + 数据迁移) (2)GPU访问的时候更好的性能,会自动引入可能内存->显存或者自动的卡间传输以及全自动的缓冲。(例如可以参考Pascal具有的显存作为缓存的模式(可以看成GPU的L3 cache,或者看成GPU支持虚拟内存---例如一张3GB的卡可以使用“虚拟的“8GB的显存,并且在并非所有位置访问概率相同的情况下,实现大小像是8GB, 性能像是本地的3GB这样的传统的虚拟内存+缓存系统的效果) 需要注意最后的增强有一定的限制,可以参考手册上的Unified/Managed Memory的相关章节。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 请问在cuda的核函数中可以按地址调用普通变量么?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档