OpenMP + SSE не дает ускорения - PullRequest
0 голосов
/ 12 апреля 2010

Мой профессор узнал об этом интересном эксперименте по 3D линейно разделяемой конволюции ядра с использованием SSE и OpenMP и дал мне задание сравнить статистику по нашей системе. Автор заявляет о сумасшедшем 18-кратном ускорении от последовательного подхода! Это может быть не всегда, но мы ожидали, что это будет как минимум в 2-4 раза быстрее, чем на двухъядерном процессоре Intel.

http://software.intel.com/en-us/articles/16bit-3d-convolution-sse4openmp-implementation-on-penryn-cpu/#comment-41994

Увы, мы не смогли найти точного ускорения. Последовательный код работает всегда лучше, с или без OpenMP.

Я использую Linux и наблюдаю определенную тенденцию ... когда в системе не запущены другие процессы, через некоторое время loadavg начинает увеличиваться, и% загрузки ЦП падает.

Еще один вероятный ложный положительный результат, с которым я случайно столкнулся ... Я запустил программу и сразу же приостановил ее. Затем я запустил его в фоновом режиме с помощью bg и увидел ускорение более чем на 2. Это происходит постоянно!

Любой совет был бы великолепен.

Спасибо, Саян

Ответы [ 2 ]

2 голосов
/ 12 апреля 2010

Вам действительно нужно профилировать свою программу, чтобы выявить узкие места. Вам также необходимо взглянуть на оптимизацию более «целостным» способом. Проблемы с производительностью могут быть связаны с плохим дизайном, плохим кодированием, ограничениями пропускной способности памяти и множеством других проблем, ни одна из которых не будет решена путем микрооптимизаций, таких как использование SIMD вместо скалярного кода.

Начните с профиля (используйте для этого инструмент, подобный Zoom ) и работайте оттуда.

0 голосов
/ 14 апреля 2010

Ну, я немного нащупал, а затем попробовал следующее: Я скомпилировал программу, используя опцию -O0 (без оптимизации), и получил ускорение почти на 2 почти для всех значений XYZ. Я также мог видеть, что на моем двухъядерном процессоре используются 2 потока (ранее он использовал только один). Но теперь, когда я удаляю прагмы OpenMP, я не вижу ускорения, это беспокоит меня, потому что SSE должен быть в состоянии значительно ускорить процесс. Так что это ускорение может быть полностью приписано OpenMP, нужно выяснить, почему SSE дает сбой. Кто-то сказал мне, что, если операции тривиальны (возможно, вес, который это слово выдвигает, является спорным, так как оно отличается от человека к человеку), использование SSE не ускоряет работу. Но я написал небольшую программу, которая вычисляет sqrt (i) / i для i_max_size = 64000 ..... и версия SSE дала ускорение 3,5 ~ 4,0. Я бы написал больше, как только я найду основную причину.

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