Во-первых, я очень мало знаю о многопоточности, и у меня возникают проблемы с поиском наилучшего способа оптимизации этого кода, но многопоточность кажется пустым, на котором я должен быть.C++ Многопоточность вложенных для циклов
double
applyFilter(struct Filter *filter, cs1300bmp *input, cs1300bmp *output)
{
long long cycStart, cycStop;
cycStart = rdtscll();
output -> width = input -> width;
output -> height = input -> height;
int temp1 = output -> width;
int temp2 = output -> height;
int width=temp1-1;
int height=temp2 -1;
int getDivisorVar= filter -> getDivisor();
int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;
int keep0= filter -> get(0,0);
int keep1= filter -> get(1,0);
int keep2= filter -> get(2,0);
int keep3= filter -> get(0,1);
int keep4= filter -> get(1,1);
int keep5= filter -> get(2,1);
int keep6= filter -> get(0,2);
int keep7= filter -> get(1,2);
int keep8= filter -> get(2,2);
//Declare variables before the loop
int plane, row, col;
for (plane=0; plane < 3; plane++) {
for(row=1; row < height ; row++) {
for (col=1; col < width; col++) {
t0 = (input -> color[plane][row - 1][col - 1]) * keep0;
t1 = (input -> color[plane][row][col - 1]) * keep1;
t2 = (input -> color[plane][row + 1][col - 1]) * keep2;
t3 = (input -> color[plane][row - 1][col]) * keep3;
t4 = (input -> color[plane][row][col]) * keep4;
t5 = (input -> color[plane][row + 1][col]) * keep5;
t6 = (input -> color[plane][row - 1][col + 1]) * keep6;
t7 = (input -> color[plane][row][col + 1]) * keep7;
t8 = (input -> color[plane][row + 1][col + 1]) * keep8;
// NEW LINE HERE
t9 = t0 + t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8;
t9 = t9/getDivisorVar;
if (t9 < 0) {
t9 = 0;
}
if (t9 > 255) {
t9 = 255;
}
output -> color[plane][row][col] = t9;
} ....
Весь этот код, скорее всего, не требуется, но он обеспечивает некоторый контекст. Так как первый из трех циклов «для» только идет от 0-2, я надеялся, что я мог бы пропустить нижние два цикла «для», чтобы все работали одновременно для другого значения «плоскости». Возможно ли это? И если да, то действительно ли это сделает мою программу быстрее?
Это то, о чем я думал, ненадолго глядя на многопоточность, но я думал, что это возможно, если t0-t9 были как-то локальны для потока? Потому что все остальные переменные не зависят от петель. – Scalahansolo
Убедитесь, что все используемые в потоке поточно-локальные, поэтому вам не нужно беспокоиться о том, что потоки наступают друг на друга, за исключением входных и выходных массивов. Для этого просто программно убедитесь, что вы никогда не будете читать/писать те же ячейки из двух разных потоков, так что вам не нужна синхронизация. –
Я только что попробовал это, используя 4 плоскости и изображение 2560x1600. Для одного потока потребовалось 109 мс, 4 потока - 47 мс. Но поскольку этот процесс очень прост, накладные расходы на создание и ожидание потоков были на самом деле достаточно значительными, но это еще больше, чем вдвое меньше времени, необходимого для расчетов. Более сложные циклы определенно выиграют от потоковой обработки. Как я уже сказал, в этом примере не нужна никакая синхронизация (кроме ожидания завершения потоков). –