cudaMemcpy()vs cudaMemcpyFromSymbol()

Dou*_*oug 9 cuda

我想弄明白为什么cudaMemcpyFromSymbol()存在.似乎'符号'func可以做的一切,nonSymbol cmds可以做到.

符号func似乎可以轻松移动数组或索引的一部分,但这可以很容易地使用nonSymbol函数完成.我怀疑nonSymbol方法会运行得更快,因为不需要符号查找.(目前尚不清楚符号查找计算是在编译还是运行时完成.)

我为什么要用cudaMemcpyFromSymbol()vs cudaMemcpy()?

tal*_*ies 11

cudaMemcpyFromSymbol是从设备内存中任何静态定义的变量进行复制的规范方法.

cudaMemcpy不能直接用于复制到静态定义的设备变量或从静态定义的设备变量复制,因为它需要设备指针,并且在运行时托管代码是未知的.因此,需要可以询问设备上下文符号表的API调用.这两个选项要么是cudaMemcpyFromSymbol在一个操作中进行符号查找和复制,要么cudaGetSymbolAddress返回可以传递给的地址cudaMemcpy.如果你只想做一个副本,前者可能更有效,后者如果你想在主机代码中多次使用地址.

  • 将变量定义为`__device__`时,定义了两个版本的变量.一个在主机上,一个在设备上.在主机代码中使用带有"&"的变量的地址,产生主机版本的地址.`cudaGetSymbolAddress()`产生设备版本的地址.`__device__`装饰器只能用于静态定义的变量. (2认同)
  • @RogerDahl:可能最好说*任何*静态定义的设备符号(\ _\_设备\ _\_,\ _ _ _常量\ _\_,甚至纹理)导致工具链发出两个*符号*,一个在设备模块中,另一个在主机对象中.CUDA运行时设置并维护这两个符号之间的动态映射.符号API调用是检索\ _\__ constant\_ _ _和\ _\_ _ device\_\_ _符号的此映射的方法.纹理API检索纹理符号的映射等. (2认同)