2017-06-01 7 views
1

私はテンソルを初期化していて、ポインタを使って直接データにアクセスしたいと思います。テンソルデータをテンソルフローでアクセスするときのセグメンテーションエラー(C++で)

input_ptr[0] 

それは、セグメンテーションフォールトが発生するが、私は理由を理解していない:私はデータにアクセスしようとすると、私は使用して、たとえば、

float *input_ptr = input.flat<float>().data(); 

を使用しています。 C++ APIによる

)(フラット

戻りデータ・タイプと所定形状の固有::テンソルとしてテンソルデータ。

これらのメソッドを使用すると、選択した寸法とサイズのデータ​​にアクセスできます。あなたはそれらを呼び出すためにテンソルの次元の数を知る必要はありません。しかし、彼らは要求された型が一致し、寸法がtensor.`これは固有テンソル私を取得します

と同じ数の要素に固有::テンソルを作成することを確認してください。さて、固有のドキュメントによると:

データ()

テンソル用のストレージへのポインタを返します。テンソルがconstの場合、ポインタはconstです。これにより、データに直接アクセスできます。データのレイアウトは、テンソルレイアウト(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

関連する問題