【问题标题】:cudaMemcpy() vs cudaMemcpyFromSymbol()cudaMemcpy() 与 cudaMemcpyFromSymbol()
【发布时间】:2013-02-12 01:46:21
【问题描述】:

我试图弄清楚为什么cudaMemcpyFromSymbol() 存在。似乎'symbol' func 可以做的一切,nonSymbol cmds 可以做。

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

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

【问题讨论】:

  • 我认为您只能使用 cudaMemcpyFromSymbol() 从常量内存中复制,但我不确定。
  • @Soroosh129... 也可以用来从全局__device__变量中复制。
  • @sgar91 哇!你能做到吗?
  • @Soroosh129... 是的。试试看:)

标签: cuda


【解决方案1】:

cudaMemcpyFromSymbol 是从设备内存中任何静态定义的变量复制的规范方式。

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

【讨论】:

  • 将变量定义为__device__时,定义了变量的两个版本。一个在主机上,一个在设备上。在主机代码中使用带有& 的变量地址,生成主机版本的地址。 cudaGetSymbolAddress() 产生设备版本的地址。 __device__ 装饰器只能用于静态定义的变量。
  • @RogerDahl:最好说 any 静态定义的设备符号(__device__、__constant__,甚至纹理)导致工具链发出两个 symbols i>,一个在设备模块中,另一个在主机对象中。 CUDA 运行时设置并维护这两个符号之间的动态映射。符号 API 调用是检索 __constant__ 和 __device__ 符号的映射的方式。纹理 API 检索纹理符号等的映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多