【问题标题】:SDSoC: Using only part of an array as sequential input in a function in HLSSDSoC:仅使用数组的一部分作为 HLS 函数中的顺序输入
【发布时间】:2021-10-27 13:15:38
【问题描述】:

这个问题涉及 Xilinx SDSoC 和 HLS 中的数据移动。

我的主函数中有一个大型一维数组,它是使用 sds_alloc 分配的。它基本上是一个二维数组(N 行和 M 列)转换为 N*M 元素的一维数组。

我还有一个函数,它在 PL 部分接受两个大小为 N 的数组作为输入。

我希望此函数处理原始二维数组的两列 - 因此,N 个元素的两部分顺序存储在一维数组中,该数组已在主函数中使用 sds_alloc 分配。

有没有一种有效的方法可以在加速函数中以流的形式顺序访问数组的这两个部分?

【问题讨论】:

    标签: vivado-hls


    【解决方案1】:

    据我所知,sds_alloc 连续分配内存缓冲区,SDSoC 通过这些缓冲区推断 DMA 传输(我假设您的目标是这样)。

    我不完全确定 SDSoC 是否能够推断并行访问“共享”阵列,但我的直觉是它可以。

    我确定您可以通过指向同一数组的不同位置的指针调用您的硬件函数(例如一个参数看起来像:&(x[i * N]))。

    我会尝试这样的方法:

    void kernel(const data_t* col_1st,
                const data_t* col_2nd,
                // [...]
                ) {
        // [...]
    }
    
    // [...]
    
    data_t* x = sds_alloc(sizeof(data_t) * N * M);
    
    for (int i = 0; i < M; i = i + 2) {
        kernel(&(x[i * N]), &(x[(i + 1) * N]), ...);
    }
    

    【讨论】:

    • 谢谢,它工作正常!我还担心 SDSoC 是否会在为 2 个不同的输入访问同一个阵列时遇到问题,但您的直觉是正确的。此外,我无法弄清楚这个解决方案是如何工作的,因为当您使用指针时,您没有指定输入数组的大小。然而,这可以通过以下方式明确完成:“#pragma SDS data copy(col_1st[0:col_size], col_2nd[0:col_size])”(或相应的 zero_copy)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多