LuaJIT ffi cdata 和 Torch Tensor 之间的最佳转换
Posted
技术标签:
【中文标题】LuaJIT ffi cdata 和 Torch Tensor 之间的最佳转换【英文标题】:Best conversion between LuaJIT ffi cdata and torch Tensor 【发布时间】:2016-09-19 09:28:26 【问题描述】:在 LuaJIT ffi cdata [1] 和 Torch Tensor [2] 之间执行转换的最佳方法是什么。
根据 Mike 在 lua-user 邮件列表 [3] 中的回复,如果我们真的想将 cdata 转换为 lua 普通表,我们必须做一个循环,将每个项目复制到一个新创建的表中。实际上,Torch Tensor 确实为更好的 LuaJIT ffi 访问提供了一些接口 [4]。所以,我目前的解决方案是先做一个循环,然后将 cdata 转换为 lua 普通表,然后调用从表中创建张量的张量构造函数 [5]。
但实际上在我的情况下,我需要非常频繁地在 LuaJIT ffi cdata 和 Torch Tensor 之间进行类似的转换,有没有比循环复制更好的方法?
[1]http://luajit.org/ext_ffi_api.html(Creating cdata Objects
部分)
[2]https://github.com/torch/torch7/blob/master/doc/tensor.md
[3]http://lua-users.org/lists/lua-l/2011-03/msg00584.html
[4]https://github.com/torch/torch7/blob/master/doc/tensor.md#luajit-ffi-access
[5]https://github.com/torch/torch7/blob/master/doc/tensor.md#torchtensortable
【问题讨论】:
【参考方案1】:如果您的cdata
代表一个连续的数据数组,那么您可以使用ffi.copy
。这是一个玩具示例:
require 'torch'
ffi = require 'ffi'
-- create a random float array
n = 3
x = torch.rand(n):float()
cdata = x:data()
assert(type(cdata) == 'cdata')
-- copy this cdata into a destination tensor
y = torch.FloatTensor(n)
ffi.copy(y:data(), cdata, n*ffi.sizeof('float'))
assert(x:equal(y))
【讨论】:
以上是关于LuaJIT ffi cdata 和 Torch Tensor 之间的最佳转换的主要内容,如果未能解决你的问题,请参考以下文章
如何用 Valgrind 检测使用 LuaJIT FFI 过程中的内存泄漏
在 Luajit/torch 中打印包含超过 10 列的张量
ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead