我想在操作期间更改输出张量的基础存储。
我有一个新数据的原始指针(float *)。我想在启动内核并返回之前将输出张量设置为这个新数据,这样我就可以劫持这个操作。
但是我很困惑我什么时候应该删除原始指针,因为张量结构似乎是浅拷贝。我只能在所有这个张量的使用完成后删除原始指针。但是我如何通知这个?
答案 0 :(得分:3)
在TensorFlow运行时中没有用于执行此操作的公共API,但可以使用C API方法TF_NewTensor()
从原始指针创建Tensor对象,该方法具有以下签名:
// Return a new tensor that holds the bytes data[0,len-1].
//
// The data will be deallocated by a subsequent call to TF_DeleteTensor via:
// (*deallocator)(data, len, deallocator_arg)
// Clients must provide a custom deallocator function so they can pass in
// memory managed by something like numpy.
extern TF_Tensor* TF_NewTensor(TF_DataType, const int64_t* dims, int num_dims,
void* data, size_t len,
void (*deallocator)(void* data, size_t len,
void* arg),
void* deallocator_arg);
在内部,这会创建一个引用计数TensorBuffer
对象,该对象获取原始指针的所有权。 (很遗憾,只有C API有friend
access才能直接从tensorflow::Tensor
创建TensorBuffer
。这是open issue。)调用deallocator
函数当引用计数降至零时,data
,len
和dellocator_arg
的值。
答案 1 :(得分:1)
不幸的是,这个信息太少,无法给出准确答案。可能,你甚至不允许删除指针!
想象一下这样的事情:
float* gf = nullptr; // global pointer (just for illustration)
void calculate()
{
float f;
gf = &f;
doSomething();
gf = nullptr;
}
同样适用,如果您的指针指向某个类静态或全局变量。
如果你在堆上创建变量,那么当你知道你不再需要它时就删除它,这可以在本地(通常)处理,例如在这个例子中:
class C
{
std::vector<float>values;
C(size_t num) : values(num, 0.0f) { }
~C() { } // data deleted automatically with vector
void function()
{
for(float& f : values)
{
gf = &f;
doSomething();
}
gf = nullptr;
}
};
缺少对operator delete[]
的显式调用?好吧,矢量对我来说是隐含处理的,所以我不必费心。即使您被迫使用原始指针,也可以通过使用e来避免删除删除。 G。 std::unique_ptr
...注意向量:如果向向量添加新元素或从向量中删除包含的元素,指针可能无效!
在我的示例中,我将gf
指针显式设置为nullptr
,以便您可以检查何时没有使用浮动值 - 您必须在劫持时检查,当然......请注意,在多线程环境中,您可能会保护指针免受竞争条件的影响。