LuaJIT ffi cdata 与 Torch Tensor 之间最佳转换方式

什么是 LuaJIT ffi cdata 和 Torch Tensor 之间最佳的转换方法 [1] [2]?

根据 Mike 在 lua-user 邮件列表中的答复 [3],如果我们真的想将 cdata 转换为 lua plain table,则必须循环复制每个项目到一个新创建的表中。实际上,Torch Tensor 提供了一些接口以使 LuaJIT ffi 访问更好 [4]。因此,我的当前解决方案是首先循环并将 cdata 转换为 lua plain table,然后调用张量构建函数从表中创建张量 [5]。

但实际上,在我的情况下,我需要经常执行类似的 LuaJIT ffi cdata 和 Torch Tensor 之间的转换,是否有更好的方法而不是循环复制呢?

点赞
用户1688185
用户1688185

如果您的 cdata 表示一组连续的数据,则可以使用 ffi.copy。以下是一个玩具示例:

require 'torch'
ffi = require 'ffi'

-- 创建一个随机的浮点数数组
n = 3
x = torch.rand(n):float()
cdata = x:data()
assert(type(cdata) == 'cdata')

-- 将此 cdata 复制到目标张量中
y = torch.FloatTensor(n)
ffi.copy(y:data(), cdata, n*ffi.sizeof('float'))

assert(x:equal(y))
2016-05-22 17:41:43