ComputeLibrary CLTensor数据传输

时间:2018-12-14 11:50:54

标签: c++ arm opencl mali

我正在将ARM ComputeLibrary集成到项目中。

这不是我所熟悉的API,但是我正在通过文档和示例进行工作。

目前,我正在尝试将std::vector的内容复制到CLTensor。然后使用ARMCL GEMM操作。

我一直在构建一个MWE,如下所示,目的是使矩阵乘法起作用。

要从标准C ++ std::vectorstd::ifstream获取输入数据,我正在尝试基于this example shown in the docs的基于迭代器的方法。

但是,我不断遇到段错误。

来源中有an example of sgemm 使用CLTensor,这也是我从中汲取灵感的地方。但是,它是从Numpy数组中获取输入数据的,因此到目前为止,这无关紧要。

在ARMCL中,我不确定CLTensorTensor是否具有不相交的方法。但是我觉得它们具有通用接口ITensor。不过,对于基于迭代器的方法,我仍然找不到使用CLTensor而不是Tensor的等效示例。

您可以在下面看到我正在使用的代码,该代码在第64行(*reinterpret_cast..)上失败。我不确定要执行的操作是什么,但是我猜想我们有一个递增input_it的ARMCL迭代器n * m,每次迭代都设置{{1} }到相应的输入值。 CLTensor只是为了使这些类型很好地配合使用?

我认为我的Iterator和Window对象还可以,但不能确定。

reinterpret_cast

1 个答案:

答案 0 :(得分:2)

您遗漏的部分(诚然可以在文档中对它进行更好的解释!)是您需要映射/取消映射OpenCL缓冲区,以使CPU可以访问它们。

如果您查看fill_random_tensor的内部(这是cl_sgemm example中使用的内容,您会打到tensor.map();

因此,如果您在创建迭代器之前map()使用缓冲区,那么我认为它应该可以工作:

a.map();
input_it(&a, input_window);
execute_window_loop(...)
{
}
a.unmap(); //Don't forget to unmap the buffer before using it on the GPU

希望这会有所帮助