我正在将ARM ComputeLibrary集成到项目中。
这不是我所熟悉的API,但是我正在通过文档和示例进行工作。
目前,我正在尝试将std::vector
的内容复制到CLTensor
。然后使用ARMCL GEMM操作。
我一直在构建一个MWE,如下所示,目的是使矩阵乘法起作用。
要从标准C ++ std::vector
或std::ifstream
获取输入数据,我正在尝试基于this example shown in the docs的基于迭代器的方法。
但是,我不断遇到段错误。
来源中有an example of sgemm 使用CLTensor
,这也是我从中汲取灵感的地方。但是,它是从Numpy数组中获取输入数据的,因此到目前为止,这无关紧要。
在ARMCL中,我不确定CLTensor
和Tensor
是否具有不相交的方法。但是我觉得它们具有通用接口ITensor
。不过,对于基于迭代器的方法,我仍然找不到使用CLTensor
而不是Tensor
的等效示例。
您可以在下面看到我正在使用的代码,该代码在第64行(*reinterpret_cast..
)上失败。我不确定要执行的操作是什么,但是我猜想我们有一个递增input_it
的ARMCL迭代器n * m
,每次迭代都设置{{1} }到相应的输入值。 CLTensor
只是为了使这些类型很好地配合使用?
我认为我的Iterator和Window对象还可以,但不能确定。
reinterpret_cast
答案 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
希望这会有所帮助