2017-06-01 52 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