Самый быстрый код:
for (int i = 0; i < 100000000; i ++) {;}
Чуть медленнее код:
#pragma omp parallel for num_threads(1)
for (int i = 0; i < 100000000; i ++) {;}
в 2-3 раза медленнее код:
#pragma omp parallel for
for (int i = 0; i < 100000000; i ++) {;}
независимо от того, что находится между {и}. Просто ; или более сложное вычисление, те же результаты. Я скомпилировал под Ubuntu 13.10 64-bit, используя gcc и g ++, пробуя разные параметры -ansi -pedantic-errors -Wall -Wextra -O3 и работая на четырехъядерном процессоре Intel с частотой 3,5 ГГц.
Я полагаю, виноваты издержки управления потоками? Для OMP не кажется разумным создавать поток каждый раз, когда он вам нужен, и уничтожать его после. Я думал, что будет четыре (или восемь) потоков, которые либо будут работать, когда это необходимо, либо спят.