Производительность параллельного программирования OpenMP на C - PullRequest
5 голосов
/ 16 января 2011

Я написал C-программу для Pi вычислений, используя OpenMP, получая помощь из книги. Я считаю, что производительность этой программы будет зависеть от используемых процессоров.

В моем случае я использовал переменную окружения , чтобы проверить производительность параллелизма, увеличив число процессоров или потоков (я не уверен, что правильно ... пожалуйста, исправьте меня)

OMP_NUM_THREADS

У меня четырехъядерный процессор, поэтому я использовал (где no_of_threads изменяется с 1 на 10):

$ export OMP_NUM_THREADS=no_of_threads

производительность при запуске программы:

1 --- 0m11.036s

2 --- 0m5,554s

3 --- 0 м3 800 с

4 --- 0m3.166s

5 --- 0m3.376s

8 --- 0m3.042s

10 --- 0m2.960s

15 --- 0m2,957s

Я могу понять увеличение производительности до 4, так как в системе 4 процессора. Но я не могу понять увеличение производительности даже после того, как число потоков превышает 4. Я знаю, что каждый увеличенный поток имеет накладные расходы, так почему производительность все еще увеличивается ..

Может кто-нибудь, пожалуйста, объясните мне это подробно.

1 Ответ

3 голосов
/ 16 января 2011

Возможно, у вас есть процессор, который поддерживает аппаратные потоки (Intel называет это гиперпоточностью ).

Что это в основном означает, что каждое из ваших ядер имеет two кэши команд и, таким образом, могут выполнять два переплетенных потока более эффективно, чем обычно.Это особенно заметно, если потокам часто приходится ждать памяти: обычно ядро ​​просто останавливается, ожидая памяти 1 .Ядро, поддерживающее гиперпоточность, может вместо этого выполнять инструкции из другого потока во время этого ожидания.


1 Не принимая во внимание переупорядочение команд и предварительную выборку.

...