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.htmlCreating 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 之间的最佳转换的主要内容,如果未能解决你的问题,请参考以下文章

(原)lua使用ffi调用c程序的函数

luajit 开启FFI + jit之后彪悍的性能

如何用 Valgrind 检测使用 LuaJIT FFI 过程中的内存泄漏

在 Luajit/torch 中打印包含超过 10 列的张量

ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead

Torch7的安装