Короче, я понял что хреново выражаю свою мыслю :-) Поэтому сочинил
пояснительный пример. Вариант 1
void foo1(float *a, float *b, int cnt)
{
for (int i =0; i<cnt; i++)
a[i] = b[i] * b[i];
}
void foo2(int *a, int *b, int cnt)
{
for (int i =0; i<cnt; i++)
a[i] = b[i] * b[i];
}
void foo(float *a, float *b, int *c, int *d, int count)
{
foo1(a, b, count);
foo2(c, d, count);
}
Вариант 2
void foo(float *a, float *b, int *c, int *d, int count)
{
for (int i =0; i<count; i++)
{ a[i] = b[i] * b[i];
c[i] = d[i] * d[i];
}
}
Предположим, что count большое, миллионы.
Для OoO процов варианты плюс-минус эквивалентны. Для VLIW процов второй вариант выглядит предпочтительнее, тело цикла можно утоптать в одну длинную инструкцию и считать массивы a и c одновременно.
Теперь представим, что foo1 и foo2 - тянутся из двух разных библиотек. Сможет ли эльбрусовый компилятор так перетряхнуть сорцы, чтобы порадовать эльбрус, сделав вариант 2 из варианта 1?