Как оптимизировать цикл, который маскирует между двумя буферами - PullRequest
0 голосов
/ 17 января 2019

У меня есть два буфера uint8_t одинакового размера, один для данных с именем A, один для маски с 3 значениями 128 для маски, 0 и 255 с именем M. Действие:

if (M[i] == 128) 
    A[i] = A[i];
else 
    A[i] = M[i];

Вот мой код

#include <stdint.h>
#include <unistd.h>

#define BUFF_SIZE 3000000

int main() {

    uint8_t A[BUFF_SIZE];
    uint8_t M[BUFF_SIZE];

    // Initialize A buffer with random values
    ...
    // Initialize M buffer with mask value
    ...

    while(1) {
    #pragma omp parallel for
        for (unsigned i = 0; i < BUFF_SIZE; i++) {
            M[i] == 128 ? 1 : A[i] = M[i];
        }
        usleep(33000);
    }
}

Если я скомпилирую без -fopenmp, программа потребляет около 50% процессорного времени, в противном случае - около 99% процессорного времени. В моей системе 6 ядер.

Так почему параллельный цикл for в этом случае требует гораздо больше ресурсов ЦП, чем сериализация?

Есть ли способ ускорить этот цикл (значение маски можно изменить, а значения 0 и 255 нельзя)?

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