У меня есть два буфера 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 нельзя)?