передача массива указателей на функцию в Vivado HLS (SDSoC 2018)

Я работаю над ускорением функции С++ с помощью SDSoC 2018.3 Vivado HLS. Эта функция просто берет массив указателей (выделенных в PS с помощью sds_alloc). Затем он перебирает этот массив, извлекает из него каждый элемент (который является адресом памяти DDR) и считывает данные, расположенные по этому адресу.

Вот простая функция, демонстрирующая идею:

float get_data_from_DDR(float *data_addresses_array[10], unsigned int size)

{

    float * address;

    float sum = 0;

    for(unsigned int i = 0; i< 10; i++)

    {

         address = data_addresses_array[i];

         for(unsigned int j = 0; j<size; j++ ) {

            sum += address[j];

        }

    }

   return sum;

}

Проблема в том, что SDSoC выдает ошибку, если я передаю массив указателей в качестве аргумента для функции верхнего уровня.

Покопавшись в мануале Vivado "ug902", я обнаружил, что:

«Vivado HLS поддерживает указатели на указатели для синтеза, но не поддерживает их на интерфейсе верхнего уровня, то есть в качестве аргумента функции верхнего уровня. Если вы используете указатель на указатель в нескольких функциях, Vivado HLS встраивает все функции, которые используют указатель на указатель. Встраивание нескольких функций может увеличить время выполнения».

Я не знаю, как решить эту проблему.

Любая помощь приветствуется.


person mnabil    schedule 01.01.2020    source источник


Ответы (1)


Я не уверен, что есть способ обойти это ограничение напрямую, но, возможно, вместо этого вы могли бы передать массив смещений, а затем использовать эти смещения в качестве индексов в массиве, который размещается в памяти DDR.

person haggai_e    schedule 02.01.2020