提问人:Jack Wells 提问时间:3/13/2022 最后编辑:Robert CrovellaJack Wells 更新时间:3/13/2022 访问量:71
ArrayFire (C++): 'gfor' dim_t循环中的参数变化 / PARTIAL unwrap() 函数
ArrayFire (C++): 'gfor' dim_t parameter variation within loops / PARTIAL unwrap() function
问:
如果有人能够帮助我解决这个问题,非常感谢。 我最近开始使用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,则该函数运行良好,但所有列都填充了第一个补丁 - 显然不是所需的行为。
偏移量可以很容易地计算出来,并且实际上已经存储在数组中,因此 offsets(ii) 将包含正确的值,但似乎没有办法使用矢量化的 'ii' seq 索引来替换 createStridedArray() 方法中的 dim_t 参数。
有没有人对如何有效地并行实现这一点有任何建议(因为在实践中,batch_size将非常大,因此确实需要以某种方式并行化/矢量化)
答: 暂无答案
评论