#pragma omp parallel for reduction(+:similarity)
for (int y = 5; y < 1920; y++)
{
int local_sim = 0;
for (int x = 5; x < 1080; x++)
{
local_sim += check(x, y);
}
similarity += local_sim;
}
#pragma omp parallel for reduction(+:similarity)
for (int y = 5; y < 1920; y++)
{
for (int x = 5; x < 1080; x++)
{
similarity += check(x, y);
}
}
Использование функций - это простое решение, но не идеальное. Если требуется сократить всего несколько инструкций, дешевле будет дублировать, чем делать вызов подпрограммы.
каким образом тело функции понимает, по какому адресу находится вершина стека?
но если попытаться делать прыжок на один участок кода из разных функций
общий код не будет понимать, с каким контекстом ему работать в данный момент
Но что, если мы имеем дело с многопоточностью
Почему считается, что вызов подпрограммы дороже, чем например использование цикла?
...
mr r3, r31 //адрес начала
mr r4, r30 //значение
mr r5, r29 //размер
loop:
cmp r5, 0
beq exit_loop
stb r4, 0(r3)
addi r3, r3, 1
addi r5, r5, -1
b loop
exit_loop:
...
//наш кусок в виде отдельной функции
memset:
cmp r5, 0
beq exit_loop
stb r4, 0(r3)
addi r3, r3, 1
addi r5, r5, -1
b memset
exit_loop:
blr //прыгнуть на запомненное место возврата
...
//в основном коде осталась лишь передача параметров и прыжок
mr r3, r31
mr r4, r30
mr r5, r29
bl memset //прыгнуть и сохранить место возврата
... //сюда вернется процессор после исполнения функции
попробуйте обернуть его в pragma omp critical (уберет все преимущества omp, но хоть проверите что дело в этом)
а распараллеливать нужно действительно ресурсоемкие операции. в том коде, что [скорее всего] применяете вы, основное время занимает обращение к памяти. короче фиг знает)
Хм, только заметил, что y идёт до 1920. Если у вас вертикальная ориентация экрана и 1080 это ширина экрана, то в коде всё верно.