Я вычисляю инкрементное среднее моих входных данных (это массив из 6 элементов, поэтому я получу 6 средних).
Это код, который я использую каждый раз, когда доступен новый входной массив (очевидно, я обновляю количество выборок ecc...):
computing_mean:for(int i=0;i<6;i++){
temp_mean[i]=temp_mean[i] + (input[i]-temp_mean[i])/number_of_samples;
//Possible optimization?
//temp_mean[i]=temp_mean[i] + divide(input[i]-temp_mean[i],number_of_samples);
}
Где все данные в коде представляют собой массивы или одно число следующего типа:
typedef ap_fixed <36,24,AP_RND_CONV,AP_SAT> decimalNumber;
Из моего сводного отчета этот цикл имеет 324 задержки и 54 задержки итерации, вызванные в основном операцией деления.
Есть ли способы улучшить скорость дивизии? Я пытался использовать hls_math и функцию разделения, но, похоже, это не работает с моим типом данных.
EDIT 1: я включаю профилировщик производительности в vivado HLS. Я добавлю автономный воспроизводимый код позже с другим редактированием. Как видите, большая часть времени уходит на SDIV
sin()
иcos()
, или таких вещей, какsqrt()
, деление всегда будет наиболее болезненным. В некоторых случаях вы можете пропустить деление и вместо этого выполнить битовый сдвиг, если вы работаете с целочисленными данными, и число, на которое вы делите, является степенью двойки. , но это все. - person tadman   schedule 13.10.2020int
,float
,double
или что? - person tadman   schedule 13.10.2020