Я работаю над ускорением функции С++ с помощью 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 встраивает все функции, которые используют указатель на указатель. Встраивание нескольких функций может увеличить время выполнения».
Я не знаю, как решить эту проблему.
Любая помощь приветствуется.