在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个浮点数所需的字节,或者这可能是一些误导性的巧合。无论哪种方式,这都不是初始化张量值的正确方法。
任何帮助将不胜感激。
答案 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);
此代码未经测试,但是应该可以给您一个很好的主意!