В коде, описанном выше, нет ничего плохого, но ваше ускорение будет ограничено тем, что основной цикл c = a + b выполняет очень мало работы - время, необходимое для выполнения вычислений (a одно добавление) будет зависеть от времени доступа к памяти (2 загрузки и одно хранилище), и будет больше конкуренции за пропускную способность памяти с большим количеством потоков, действующих на массив.
Мы можем проверить это, сделав работу внутри цикла более ресурсоемкой:
c[i] = exp(sin(a[i])) + exp(cos(b[i]));
И тогда мы получим
$ ./apb
Time SEQ= 17678571 microsecs
Number of threads = 4
Time OMP= 4703485 microsecs
speedup= 3.758611
, что, очевидно, намного ближе к 4-кратному ускорению, которое можно ожидать.
Обновление: Да, и к другим вопросам - gettimeofday (), вероятно, подходит для синхронизации, а в системе, где вы используете xlc - это AIX? В этом случае peekperf является хорошим инструментом для повышения общей производительности, а аппаратные мониторы производительности предоставят вам доступ к времени доступа к памяти. На платформах x86 бесплатные инструменты для мониторинга производительности многопоточного кода включают cachegrind / valgrind для отладки производительности кэша (здесь не проблема), scalasca для общих проблем с OpenMP и OpenSpeedShop, также довольно полезный.