カラムメジャーフォーマットのアレイファイアアレイに対して線形化されたSTLペンダントであるstl::array<float, 24> foo
があるとします。 af::array bar = af::array(4,3,2, 1, f32);
。だから私はオブジェクトdims
とbar
の寸法を持って、私は最大4 af::seq
- オブジェクトを持って、私は線形化された配列foo
を持っています。arrayfireから線形インデックスを明示的に取得する方法は?
foo
のインデックス(すなわち、bar
の線形化されたバージョン)をどのように明示的に得ることが可能ですか? 2.ndおよび3.rd行、すなわちbar(af::seq(1,2), af::span, af::span, af::span)
?私は以下の小さなコード例を持っています。これは私が望むものを示しています。最後に、私はなぜこれが欲しいかを説明します。
af::dim4 bigDims = af::dim4(4,3,2);
stl::array<float, 24> foo; // Resides in RAM and is big
float* selBuffer_ptr; // Necessary for AF correct type autodetection
stl::vector<float> selBuffer;
// Load some data into foo
af::array selection; // Resides in VRAM and is small
af::seq selRows = af::seq(1,2);
af::seq selCols = af::seq(bigDims[1]); // Emulates af::span
af::seq selSlices = af::seq(bigDims[2]); // Emulates af::span
af::dim4 selDims = af::dim4(selRows.size, selCols.size, selSlices.size);
dim_t* linIndices;
// Magic functionality getting linear indices of the selection
// selRows x selCols x selSlices
// Assign all indexed elements to a consecutive memory region in selBuffer
// I know their positions within the full dataset, b/c I know the selection ranges.
selBuffer_ptr = static_cast<float> &(selBuffer[0]);
selection = af::array(selDims, selBuffer_ptr); // Copies just the selection to the device (e.g. GPU)
// Do sth. with selection and be happy
// I don't need to write back into the foo array.
Arrayfireは、要素にアクセスするために実装され、このようなロジックを持っている必要がありますし、私はそのようなaf::index, af::seqToDims, af::gen_indexing, af::array::operator()
など、いくつかの関連クラス/関数を発見した - 私はまだ簡単な方法を見つけ出すことができませんでしたが。
私は基本的にoperator()
を再実装することを考えました。同様に動作しますが、配列オブジェクトへの参照は必要ありません。しかし、配列ファイアフレームワークで簡単な方法があれば、これは無駄な努力になるかもしれません。
背景:arrayfireだけメインメモリにデータを保存することはできませんので、GPUのバックエンドにリンクされながら 私がそうしたい理由は、(CPU-コンテキスト)です。私は大量のデータを処理する必要があり、VRAMは非常に限られているので、私はいつもメインメモリに常駐するstl-containerからaf::array
-adjectをインスタンス化したいと思います。
もちろん私は自分の問題を回避するためにいくつかのインデックスマジックをプログラムすることができますが、私はかなり複雑なインデックスのロジックを効率的に実装することができるaf::seq
オブジェクトを使いたいと思います。
なぜリニアインデックスがこの場合に役立つのですか?線形インデックスを取得した後に行う計画について、いくつかのコードを表示することができれば、それは素晴らしいものになります。 –