Для чего вы вангуете?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.
то есть я угадал, предположив, что libc содержит оптимальную memcpy. тогда снова предположу, что еще быстрее сдвинуть можно при помощи DMA...Apparatchik писал(а):Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
да все понятно уже. все получается абсолютно без сдвиговApparatchik писал(а):Выборки две, они набираются паралельно, на 400 элементов, но одну нужно сдвинуть относительно другой, обычно на 5-6 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
Код: Выделить всё
int16_t buf_U[400];
int16_t buf_I[400];
#define SDVIG 5
//обрабатываете свои буферы С УЧЕТОМ СДВИГА как-то так
uint16_t index_I=SDVIG;
int32_t sum;
for(int i=0; i<400; i++){
sum += buf_U[i] * buf_I[index_I];
if(++index_I >= 400) index_I = 0;
} Код: Выделить всё
// пишем в первую половину массива разницу между первой и второй половиной,
for (i = max_index / 2, j = i; i < max_index; i++) {
current[i - j] -= current[i];
}
// во вторую половину пишем первую с противоположным знаком
for (i = max_index / 2, j = i; i < max_index; i++) {
current[i] = current[i - j] * (-1);
}
Код: Выделить всё
int32_t sum = 0;
uint32_t *p1 = &buf_U[0], *p2 = buf_I[SDVIG];
int i = 400 / 2;
do sum = __SMLAD(*p1++, *p2++, sum);
while (--i);только вы забываете, что у автора обработка в цикле ПОСЛЕ memcpy, т.е. все такты копирования пойдут плюсом к обработке. а управление индексом добавить по 2-3 такта на итерацию ПОЛЕЗНОГО цикла. так что это еще большой вопрос, что окажется быстрее по совокупностиjcxz писал(а):такое управление индексом добавит кучу лишних тактов в цикл. Много больше чем memcpy() на больших выровненных массивах.
только вы забываете, что у автора обработка в цикле ПОСЛЕ memcpy, т.е. все такты копирования пойдут плюсом к обработке. а управление индексом добавить по 2-3 такта на итерацию ПОЛЕЗНОГО цикла. так что это еще большой вопрос, что окажется быстрее по совокупности[/uquote]jcxz писал(а):такое управление индексом добавит кучу лишних тактов в цикл. Много больше чем memcpy() на больших выровненных массивах.
нет, конечно.jcxz писал(а):А вы компилировать пробовали, то что предложили?
собственно, с этого я и начал, так что не надо мне об этом рассказывать.jcxz писал(а):Кроме того данные у автора 16-битные, а memcpy() внутри оптимизирована и на больших массивах, выровненных на границу 32бит, будет копировать по 8 шт. 32-битных слов за итерацию, т.е. - будет тратить всего ~ 2 такта на копирование каждой пары значений.
Код: Выделить всё
u32 *p1 = &d.sh.bp[0], sum = 0;
enum {SDVIG = 100};
int i = 400 / 2;
do {
sum = __SMLAD(p1[0], p1[SDVIG], sum);
p1++;
} while (--i);
Код: Выделить всё
MOVS R0,#+200
??DtePwm_0:
LDR R3,[R2, #+400]
LDR R6,[R2], #+4
SUBS R0,R0,#+1
SMLAD R1,R6,R3,R1
BNE.N ??DtePwm_0