假设我有stl::array<float, 24> foo
一个列主格式 arrayfire 数组的线性化 STL 挂件,例如af::array bar = af::array(4,3,2, 1, f32);
. 所以我有一个尺寸为的af::dim4
对象,最多有 4 个对象,并且我有线性化数组。dims
bar
af::seq
foo
如何明确地获得表示例如第 2.nd 和 3.rd 行的索引foo
(即 的线性化版本bar
),即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 框架中有一种简单的方法,这可能是浪费精力。
背景:
我想这样做的原因是,arrayfire 不允许在与 GPU 后端链接时仅将数据存储在主内存(CPU 上下文)中。由于我有大量数据需要逐个处理并且 VRAM 非常有限,因此我想af::array
从始终驻留在主内存中的 stl 容器临时实例化 -objects。
当然,我知道我可以编写一些索引魔法来解决我的问题,但我想使用相当复杂af::seq
的对象,这可能会使索引逻辑的有效实现变得复杂。