У меня есть следующий цикл, который я запускаю на процессоре ARM.
// pin here is pointer to some part of an array
for (i = 0; i < v->numelements; i++)
{
pe = pptr[i];
peParent = pe->parent;
SPHERE *ps = (SPHERE *)(pe->data);
pin[0] = FLOAT2FIX(ps->rad2);
pin[1] = *peParent->procs->pe_intersect == &SphPeIntersect;
fixifyVector( &pin[2], ps->center ); // Is an inline function
pin = pin + 5;
}
По медленному выполнению цикла могу судить, что компилятору не удалось развернуть этот цикл, т.к. когда я вручную делаю раскрутку, она становится достаточно быстрой. Я думаю, что компилятор запутался в указателе pin
. Можем ли мы использовать здесь ключевое слово restrict
, чтобы помочь компилятору, или restrict
зарезервировано только для параметров функции? В общем, как мы можем сказать компилятору развернуть его и не беспокоиться об указателе pin
.
v->numelements
локальному и использовать его в цикле for? Возможно, компилятор не может развернуть цикл, потому что он должен предположить, что значениеv->numelements
будет изменено вfixifyVector
. - person Axel   schedule 15.04.2013numelements
? Если это миллионы, вы можете избежать многих переходов кода и, следовательно, сравнений, развернув код. Или есть другие преимущества развертывания цикла, которые нельзя получить в этом сегменте? - person jn1kk   schedule 15.04.2013