Настройка математических параллельных кодов - PullRequest
3 голосов
/ 25 марта 2012

Если предположить, что меня интересует производительность, а не переносимость моего итеративного многопоточного решателя линейной алгебры, и что у меня есть результаты профилирования моего кода, как мне настроить мой код для оптимальной работы на этой машине? мой выбор?

Алгоритм включает умножения матрицы-вектора, нормы и точечные произведения. (FWIW, я работаю над CG и GMRES).

Я работаю над кодами, размер матрицы которых приблизительно равен полному объему оперативной памяти (~ 6 ГБ). Я буду работать на Intel i3 Laptop. Я буду связывать свои коды с помощью Intel MKL.

В частности,

  • Есть ли хороший ресурс (PDF / Книга / Бумага) для изучения ручной настройки? Есть множество вещей, которые я узнал, например, делая: ручное развертывание не всегда оптимально или флаги компилятора, но я бы предпочел централизованный ресурс.

  • Мне нужно что-то для перевода информации о профилировщике для повышения производительности. Например, мой профилировщик сообщает мне, что мой стек одного процессора используется другим, или что мой mulpd ASM принимает слишком много времени. Я понятия не имею, что они означают и как я могу использовать эту информацию для улучшения своего кода.

Мое намерение - потратить столько времени, сколько нужно, чтобы сжать как можно больше вычислительной мощности. Это больше опыт обучения, чем для фактического использования или распространения на данный момент.

(меня беспокоит ручная настройка, а не автоматическая настройка)

Прочие сведения:

  • Это отличается от обычной настройки производительности, поскольку основные части кода связаны с проприетарной библиотекой MKL от Intel.
  • Из-за проблем с пропускной способностью памяти в O (N ^ 2) матричных умножениях и зависимостях существует предел того, чем я мог бы управлять самостоятельно с помощью простого наблюдения.
  • Я пишу на C и Fortran, и я пробовал оба, и, как уже миллион раз обсуждалось на SO, я не нашел никакой разницы в том, настроил ли я их соответствующим образом.

1 Ответ

2 голосов
/ 26 марта 2012

Черт возьми, на это до сих пор нет ответов. Прочитав это, у вас все равно не останется полезных ответов ...

Вы подразумеваете, что вы уже сделали все очевидные и общие вещи, чтобы сделать ваши коды быстрыми. В частности, у вас есть:

  • выбрал самый быстрый алгоритм для вашей задачи (либо это, либо ваша задача - оптимизировать реализацию алгоритма, а не оптимизировать поиск решения проблемы);
  • работал ваш компилятор как собака, чтобы выжать последнюю каплю скорости выполнения;
  • связаны в лучших библиотеках, которые вы можете найти, которые вообще используются (и проверены, чтобы убедиться, что они действительно улучшают производительность вашей программы;
  • ручной доступ к вашей памяти для оптимизации производительности чтения;
  • сделал все очевидные маленькие трюки, которые мы все делаем (например, при сравнении норм 2 векторов вам не нужно брать квадратный корень, чтобы определить, что один «больше», чем другой, ...);
  • ударил параллельную масштабируемость вашей программы с точностью до мошки линии S == P на графиках производительности;
  • всегда выполнял вашу программу с правильным размером задания для заданного числа процессоров, чтобы максимизировать некоторую меру производительности;

и все же вы не удовлетворены!

Теперь, к сожалению, вы близки к истокам, и информацию, которую вы ищете, нелегко найти в книгах или на веб-сайтах. Даже здесь, на ТАК. Одной из причин этого является то, что вы сейчас заняты оптимизацией своего кода на своей платформе, и вы в лучшем положении для диагностики проблем и их устранения. Но эти проблемы, скорее всего, будут очень локальными; Вы можете прийти к выводу, что никто, кроме вашей непосредственной исследовательской группы, не будет заинтересован в том, что вы делаете, я знаю, что вас не заинтересует ни одна из микрооптимизаций, которые я выполняю для своего кода на моей платформе.

Вторая причина заключается в том, что вы вступили в область, которая все еще является активным исследовательским фронтом, и полезные уроки (если таковые имеются) опубликованы в научной литературе. Для этого вам нужен доступ к хорошей исследовательской библиотеке, если у вас ее нет рядом, то и цифровые библиотеки ACM и IEEE-CS - это хорошее место для начала. (Оставьте комментарий или комментарий, если вы не знаете, что это такое.)

На вашем посту я бы посмотрел журналы по двум темам: компьютерные и лабораторные вычисления для науки и техники и разработки компиляторов. Я верю, что первое очевидно, а второе может быть менее очевидно: но если ваш компилятор уже выполнил все (полезные) передовые оптимизации, вы бы не задавали этот вопрос, и разработчики компиляторов прилагают все усилия, чтобы ваши преемники победили не должен.

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

EDIT

Во-первых, позвольте мне прямо указать на то, что изначально подразумевалось в моем «ответе»: я не готов тратить достаточно много времени на SO, чтобы провести вас даже через краткое изложение знаний, которые я получил за 25 с лишним лет в области научных исследований. Инженерные и высокопроизводительные вычисления. Мне не дано писать книги, но многие есть, и Amazon поможет вам их найти. Этот ответ был намного длиннее, чем большинство, которые я хотел бы опубликовать, прежде чем добавить этот бит.

Теперь, чтобы подобрать очки в вашем комментарии:

  • о «ручном доступе к памяти» начните со статьи в Википедии о «циклическом разбиении по циклам» (видите, вы даже не можете положиться на меня, вставив сюда URL-адрес) и прочесть оттуда; у вас должна быть возможность быстро подобрать термины, которые вы можете использовать в дальнейших поисках.
  • о «работе вашего компилятора как собаки», я действительно имею в виду знакомство с его документацией и детальное понимание намерений и реалий различных опций; в конечном итоге вам придется много тестировать опции компилятора, чтобы определить, какие «лучше» подходят для вашего кода на вашей платформе (ах).
  • на «микрооптимизациях», ну вот и начнем: Оптимизация производительности численно интенсивных кодов . Не убегайте от мысли, что вы узнаете все (или даже многое) из того, что вы хотите узнать из этой книги. Сейчас около 10 лет. Сообщения на вынос:
    • оптимизация производительности требует близости с архитектурой машины;
    • Оптимизация производительности состоит из 1001 отдельных шагов, и, как правило, невозможно предсказать, какие из них будут наиболее полезными (а какие действительно вредными) без детального понимания программы и ее среды выполнения;
    • Оптимизация производительности - это спорт с участием, вы не сможете изучить его, не занимаясь этим;
    • Оптимизация производительности требует пристального внимания к деталям и хорошего ведения записей.

Да, и никогда не пишите умную часть оптимизации, которую вы не сможете легко отписать, когда в следующем выпуске компилятора будет реализован лучший подход. Я провожу довольно много времени, удаляя хитрые уловки с 20-летнего Фортрана, которые были оправданы (если вообще были) соображениями повышения производительности выполнения, но которые сейчас просто смущают программиста (это тоже меня бесит) и получают на пути компилятора, выполняющего свою работу.

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

...