假設我有一個stl::array<float, 24> foo
這是一個線性化的STL掛件到一個列 - 專業格式陣列陣列,例如, af::array bar = af::array(4,3,2, 1, f32);
。所以我有一個af::dim4
對象dims
尺寸bar
,我有多達4 af::seq
-對象,我有線性陣列foo
。如何從arrayfire中顯式獲取線性索引?
怎樣才能明確得到foo
(即bar
的線性化版本)代表例如第2.nd和第3.r行,即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不允許只存儲在主內存(CPU上下文)的數據,同時針對GPU後端被鏈接。由於我有大量的數據需要逐塊處理,並且VRAM非常有限,所以我想從始終駐留在主內存中的stl容器實例化af::array
-object ad-hoc。
當然我知道我可以編寫一些索引魔術來解決我的問題,但我想使用相當複雜的對象,這可以使索引邏輯的高效實現變得複雜。
爲什麼在這種情況下線性指數會有所幫助?如果您可以在獲得線性指數後顯示一些關於您打算做什麼的代碼。 –