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カーネルをメモリ間接の 以下の余分なレベルを避けるためにしたいと思います。
- CPU Tensorflowカーネルコードはhereです。
- GPU Tensorflowカーネルコードはhereです。
- Pythonの変数の設定コードを使用すると、1つまたは複数の入力のへ(または出力から)TensorFlow
OpKernel
はあなたが値にアクセスすることを可能にする「ホストメモリ」、であることを指定することができhere
ありがとう:これを行うには、
.HostMemory("ref_freq")
命令を追加するために、あなたのREGISTER_KERNEL_BUILDER()
コールを修正します! HostMemory命令はまた、ref_freqのGPUへの転送を防ぎますか? – SimonHostMemory命令は、ランタイムによって自動的にコピーされないようにします。私は決して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
これはまさに私が探していたものです。 – Simon