Ускорение цикла, (динамический) ограниченный индекс - PullRequest
0 голосов
/ 21 октября 2019

У меня есть два цикла for с ограничениями nr и nc, и я хочу ускорить код, вычисляя только те индексы, которые мне действительно нужно вычислить. У меня есть эти два кода, и я компилирую их с помощью gcc -O3.

Первый занимает всего около 3 секунд:

int i;
int j;
for(i=0; i<nr; i++){
    for(j=0; j<nc; j++){
        *(arr+i*nc+j) = fun(i,j);
    }
}

И вторая функция (которая должна быть быстрее или, по крайней мере, не медленнее). , поскольку число циклов меньше или равно):

int i;
int j;
int oi;
int oj;

i = (px-d > 0) ? (px-d) : 0;
j = (py-d > 0) ? (py-d) : 0;

oi = (px+d < nr) ? (px+d) : nr;
oj = (py+d < nc) ? (py+d) : nc;


for(; i<oi; i++){
    for(; j<oj; j++){
        *(arr+i*nc+j) = fun(i,j);
    }
}

px, py и d являются аргументами этих функций. Время выполнения:

первое: ~ 3 секунды

второе: ~ 4,3 секунды

Во второй функции есть еще несколько инструкций, но они должны быть действительно дешевыми по сравнению с подобными10.000 вызовов fun-функции через цикл. Я что-то здесь скучаю? Меняет ли эта «динамическая» инициализация i, j способ, которым gcc может оптимизировать код? Могу я что-нибудь с этим сделать?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...