2016-05-19 5 views
0

IはそうのようなOP登録:テンソルフローでは、GPUに移動する前にスカラーテンソル値にどのようにアクセスしますか? tensorflowで

REGISTER_OP("RimeBSqrt") 
    .Input("stokes: FT") 
    .Input("alpha: FT") 
    .Input("frequency: FT") 
    .Input("ref_freq: FT") 
    .Output("b_sqrt: CT") 
    .Attr("FT: {float, double} = DT_FLOAT") 
    .Attr("CT: {complex64, complex128} = DT_COMPLEX64"); 

上記入力のすべてが、テンソルである しかしref_freqはスカラーまたは0次元テンソルです。

const Tensor & in_ref_freq = context->input(3); 
FT ref_freq = in_ref_freq.tensor<FT, 1>()(0); 

ただし、同じ種類のコードは、私のGPUカーネルの計算()メソッドでセグメンテーションフォルト を生成します。私はスカラーを抽出するために、次の操作を行うことができ、私のCPUのカーネル の計算()メソッドで CPUが GPUデバイスのメモリブロックにアクセスしようとしているためです。とにかくこのスカラーをGPUに送る前に値 を傍受することはありますか?私はAttrはそれを変更、設定可能な値であるため、ref_freqに使用するアプローチであるとは思わない

template <typename FT> 
__global__ void kernel(..., FT * ref_freq, ...) 
{ 
    FT value = ref_freq[0]; 
} 

:私は でCUDAカーネルをメモリ間接の 以下の余分なレベルを避けるためにしたいと思います。

  1. CPU Tensorflowカーネルコードはhereです。
  2. GPU Tensorflowカーネルコードはhereです。
  3. Pythonの変数の設定コードを使用すると、1つまたは複数の入力のへ(または出力から)TensorFlow OpKernelはあなたが値にアクセスすることを可能にする「ホストメモリ」、であることを指定することができhere

答えて

3

ですCompute()方法。

REGISTER_KERNEL_BUILDER(
    Name("RimeBSqrt") 
    .Device(tensorflow::DEVICE_GPU) 
    .TypeConstraint<float>("FT") 
    .TypeConstraint<tensorflow::complex64>("CT") 
    .HostMemory("ref_freq"), 
    RimeBSqrt<tensorflow::GPUDevice, float, tensorflow::complex64>); 
+0

ありがとう:これを行うには、.HostMemory("ref_freq")命令を追加するために、あなたのREGISTER_KERNEL_BUILDER()コールを修正します! HostMemory命令はまた、ref_freqのGPUへの転送を防ぎますか? – Simon

+0

HostMemory命令は、ランタイムによって自動的にコピーされないようにします。私は決してCUDAのエキスパートではありませんが、 'OpKernel'を修正してテンソルから' float'値を抽出し、それを 'float'引数としてCUDAカーネルに渡すと思います。 int [ここ](https://github.com/ska-sa/montblanc/blob/53edf2ba505e4b5b10ae89e187c4f11d1e7072db/montblanc/tensorflow/rime_ops/b_sqrt_op_gpu.h#L71))。 – mrry

+0

これはまさに私が探していたものです。 – Simon

関連する問題