如果有人能帮助我解决这个问题,请提前表示感谢。
我最近开始使用ArrayFire C++Matrix库,发现它非常棒,但我遇到了一个无法通过文档和/或在线搜索解决的问题。
简单地说,我需要创建的函数是
unrwap
()函数(生成图像的所有{潜在重叠}平坦2D窗口的列矩阵)。然而,我正在处理的数据可能很大,由于内存限制,尝试使用完整的unwrap()函数会导致程序崩溃。即使可以实现,也非常低效,因为我在任何时候都只想访问这些“补丁”的一个子集。
我真正想要的是一个有效的功能。。。
array unwrap(array& in, seq desired_indexes, .... );
其中,“所需索引”决定了生成理论“完整”展开中的哪些列。
起初,我认为这可以通过GFOR来实现,比如。。。
// Some Device pointer
int* input_ptr = (some af::array).device<T>();
// Set stride and shape
dim4 shape(h, w, c); // dimensions of "patch"
dim4 strides(sh, sw, sc); // stride of input array
int batch_size = 5; // Trivially small batch size as an example)
dtype typeX(u32);
array X(dim4(h*w*c, batch_size), typeX); // Generating the column matrix
gfor(seq ii, batch_size)
{
X(span, ii) = af::flat(af::createStridedArray(input_ptr, OFFSET, shape, strides, typeX, af::source::afDevice));
}
但是,我看不出有什么方法可以为每个gfor“循环”提供不同的OFFSET值,如果OFFSET被替换为0,函数运行良好,但所有列都填充了第一个补丁——显然不是理想的行为。
偏移量可以很容易地计算出来,并且实际上已经存储在数组中,这样偏移量(ii)将包含正确的值,但似乎无法使用矢量化的'ii'seq索引来替换createStridedArray()方法中的dim_t参数。
有人对如何高效并行实现这一点有什么建议吗(因为在实践中,batch_size将非常大,因此确实需要以某种方式进行并行化/矢量化)