在ARM计算库中初始化张量的正确方法?

时间:2018-07-11 17:14:24

标签: c++11 initialization arm tensor

在ARM计算库中初始化张量的正确方法是什么?我没有找到有关正确方法的任何文档。

我的张量包含浮点数(F32)。我可以通过buffer()接口访问基础数据来直接写数据,该接口返回一个指向uint8_t的指针。但是,我不确定如何弄清楚数据布局,因为它看起来并不连续,也就是说,如果我将4个浮点数写入4x1张量,

Tensor x{};

x.allocator()->init(TensorInfo(4, 1, Format::F32));

float xdata[] = {1, 2, 3, 4}; 
FILE *fd = fmemopen(x.buffer(), 4 * sizeof(float), "wb");
fwrite(xdata, sizeof(float), 4, fd);
fclose(fd);

x.print(std::cout);

打印出来,

  

1 2 3 1.17549e-38

'x'的第三个元素已初始化,但最后一个未初始化。如果我将fwrite行更改为

fwrite(xdata, sizeof(float), 6, fd);

那么输出是

  

1 2 3 4

因此,可能分配了更多的字节,而不是4个浮点数所需的字节,或者这可能是一些误导性的巧合。无论哪种方式,这都不是初始化张量值的正确方法。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

从arm计算库文档(v18.08)中,看起来合适的初始化方式是“ import_memory”函数。在此处查看示例:https://github.com/ARM-software/ComputeLibrary/blob/master/tests/validation/NEON/UNIT/TensorAllocator.cpp

答案 1 :(得分:0)

我认为您也必须分配张量。

更精确

Tensor x{};

x.allocator()->init(TensorInfo(4, 1, Format::F32)); Set the metadata
x.allocator()->allocate(); // Now the memory has been allocated

float xdata[] = {1, 2, 3, 4}; 
memcpy(x.data(), xdata, 4 * sizeof(float), "wb");

x.print(std::cout);

此代码未经测试,但是应该可以给您一个很好的主意!