访问张量流张量数据时的分割错误(在C++中)
我有(初始化的)张量input
并且想要直接使用指针访问数据。我使用访问张量流张量数据时的分割错误(在C++中)
float *input_ptr = input.flat<float>().data();
当我试图访问数据,例如,通过使用:
input_ptr[0]
它会导致分段错误,但我不明白为什么。
根据该C++ API:
平()
返回的张量数据作为本征::张量数据类型的与指定的形状。
这些方法允许您访问您选择的尺寸和大小的数据。您不需要知道张量的维数来调用它们。然而,他们检查类型是否匹配,并且要求的尺寸创建了一个Eigen :: Tensor,其张量与元素数量相同。'
这使我得到特征张量。现在,根据本征文档:
数据()
将指针返回到该存储的张量。如果张量为常量,则指针为常量。这允许直接访问数据。数据的布局取决于张量布局:RowMajor或ColMajor。
例子:
Eigen::Tensor<float, 2> a(3, 4);
float* a_data = a.data();
>a_data[0] = 123.45f;
>cout << "a(0, 0): " << a(0, 0);
>=> a(0, 0): 123.45
所以,就我所知道的,我应该能够使用input_ptr
没有问题。 (值得注意的是指针确实指向了一个有效的位置,例如,我可以使用cudaMemcpy
成功地将其内容复制到设备数组中,所以问题必须是我不允许访问数据的位置,我只是不明白为什么。)
任何想法,将不胜感激。
它看起来像你试图从CPU访问GPU张量。这是行不通的。
要操纵GPU张量,请直接使用特征操作或写入放置在CPU上的op,以便张量将被复制,然后您可以访问它。
Welp。它甚至没有想到张量位于GPU中。我的gpu代码工作完美(尽管host2dev memcpy命令),所以我愚蠢地认为它按预期工作,并没有打扰检查。谢谢。 – Dealan
这是一个好主意,检查使用前的指针.. – Zakir
公平不够,我忽视这样做。 (虽然,如上所述,在这种特定情况下,我知道指针不为空。) – Dealan