代码之家  ›  专栏  ›  技术社区  ›  Jack Wells

ArrayFire(C++):'gfor'dim_t参数在循环/PARTIAL unwrap()函数内的变化

  •  0
  • Jack Wells  · 技术社区  · 2 年前

    如果有人能帮助我解决这个问题,请提前表示感谢。 我最近开始使用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将非常大,因此确实需要以某种方式进行并行化/矢量化)

    0 回复  |  直到 2 年前