找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 253|回复: 1

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

[复制链接]
发表于 2018-4-12 13:03:48 | 显示全部楼层 |阅读模式
ESC4000G3
请问在cuda的核函数中可以按地址调用普通变量么?
回复

使用道具 举报

发表于 2018-4-12 13:57:15 | 显示全部楼层
Jetson TX2
大姐大好!

完全无问题,从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的相关章节。

Regards,
你的屠戮人神。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表