OpenMP + SSE не дает ускорения

Мой профессор узнал об этом интересном эксперименте 3D Linearly separable Kernel Convolution с использованием 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 начинает увеличиваться, а %CPU падает.

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

Будем признательны любому совету.

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


person Sayan Ghosh    schedule 12.04.2010    source источник
comment
Вы уверены, что скорость вашего процессора является узким местом?   -  person Mene    schedule 12.04.2010
comment
Извините, что исключил одну важную часть. Я просто посылаю программе две вещи: XYZSize и количество раз, которое программа должна запускать. Итак, на двухъядерном процессоре с 4 ГБ ОЗУ, если я передам 1024X1024x1024 для целочисленных значений, ограничение в 4 ГБ будет соблюдено. Может быть, поэтому происходят странные вещи с падением %CPU и увеличением нагрузки. Но даже для меньших значений, таких как 16,32,64 или 256 (программа принимает XYZSize, кратный 8), никакого ускорения нет.   -  person Sayan Ghosh    schedule 13.04.2010


Ответы (2)


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

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

person Paul R    schedule 12.04.2010

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

person Sayan Ghosh    schedule 14.04.2010
comment
Ну вроде понял причину. Существует переключатель компилятора -fmpmath=unit, который решает, будут ли вычисления с плавающей запятой преобразованы в sse или i387. Для машин x86 по умолчанию используется sse. gcc.gnu.org/ml/gcc-patches/2004- 11/msg02119.html - person Sayan Ghosh; 15.04.2010