2017-06-01 53 views
1

我有(初始化的)张量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成功地将其内容复制到设备数组中,所以问题必须是我不允许访问数据的位置,我只是不明白为什么。)

任何想法,将不胜感激。

+0

这是一个好主意,检查使用前的指针.. – Zakir

+0

公平不够,我忽视这样做。 (虽然,如上所述,在这种特定情况下,我知道指针不为空。) – Dealan

回答

0

它看起来像你试图从CPU访问GPU张量。这是行不通的。

要操纵GPU张量,请直接使用特征操作或写入放置在CPU上的op,以便张量将被复制,然后您可以访问它。

+0

Welp。它甚至没有想到张量位于GPU中。我的gpu代码工作完美(尽管host2dev memcpy命令),所以我愚蠢地认为它按预期工作,并没有打扰检查。谢谢。 – Dealan