|
4 / 4 / 0
Регистрация: 25.03.2011
Сообщений: 28
|
||||||
вторая производная с использованием SSE12.10.2012, 23:06. Показов 2711. Ответов 10
Метки нет (Все метки)
Задача: Таблично задана функция, необходимо вычислить вторую производную методом конечных разностей.
Выбранный подход к решению: Считываем в регистры 3 массива по 4 элемента, один со сдвигом влево (копируем с i-1 элемента: строка 65), второй с нулевым сдвигом (строка 66) и третий со сдвигом вправо (копируем с i+1 элемента: строка 67). Делаем вычисления. Копируем обратно. Программа работает, но sse версия работает много медленнее чем обычное решение. Подозреваю, что проблема в использовании _mm_set_ps для копирования в регистры (строки 65-67) и организации обратного копирования из регистров (строки 69-71). Вопрос: Как можно оптимизировать/сделать вменяемыми операции копирования?
0
|
||||||
| 12.10.2012, 23:06 | |
|
Ответы с готовыми решениями:
10
вторая производная
Интерполяция и вторая производная |
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
|
| 13.10.2012, 22:53 | |
|
фигню написал... удалено
0
|
|
|
4 / 4 / 0
Регистрация: 25.03.2011
Сообщений: 28
|
|
| 14.10.2012, 10:38 [ТС] | |
|
Как можно организовать копирование начиная с любого i-го (не кратного 4) элемента массива в регистр и наоборот? Без использования _mm_set_ps и костыля из строк 74-77.
0
|
|
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
|||||||||||
| 14.10.2012, 11:31 | |||||||||||
|
попытка номер 2
вот кодКликните здесь для просмотра всего текста
Вот результат (core 2 duo 2,5GHz):
2. N также придется сделать кратным 16, чтобы массив ровно ложился. У вас было 16*1024+1... +1 - плохо, убрал. 3. Чтобы "выравнено" положить i-1 и i+1 элементы пришлось для них завести отдельные массивы, иначе сдвиг на единицу нарушает выравнивание. Подозреваю, что оптимизация здесь еще не закончена, будут улучшения, напишите.
1
|
|||||||||||
|
4 / 4 / 0
Регистрация: 25.03.2011
Сообщений: 28
|
|
| 14.10.2012, 11:48 [ТС] | |
|
grgdvo, большое спасибо за развернутый ответ
![]() на самом деле данная задачка просто кусочек основной - трехмерная задача теплопроводности, то есть в ней полный массив данных будет размером Nx*Ny*Nz, причем Nx и Ny (количество элементов сетки вдоль осей x и y) будут не всегда кратные 4 (не переклинит ли load в один момент?). Ну и их количество тоже будет не всегда маленькое, не хотелось бы память забивать еще двумя массивами (для левой и правой точки при вычислении производных), опять же пере присваивание на каждом шаге будет съедать некоторое время.
0
|
|
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
|||
| 14.10.2012, 15:33 | |||
Если адрес не кратен 16, то будет segmentation fault.Если у вас планируется размерности по координатам превышать 100 единиц и выше, то сразу переходите на MPI и другой принцип программирования. С SIMD вы не получите должного ускорения (идеальный потолок для SSE : ускорение в 4 раза).
0
|
|||
|
4 / 4 / 0
Регистрация: 25.03.2011
Сообщений: 28
|
|
| 14.10.2012, 16:21 [ТС] | |
|
SIMD планирую использовать совместно с MPI (но для начала с OpenMP скрестить хочу), верно ли понимаю, что корректного использования SSE придется отказаться от развертывания 3D массива в 1D ? иначе при умножении на 4 (в начале считывания) будет получаться черти что?
0
|
|
|
|
|
| 14.10.2012, 21:00 | |
|
Для чистоты эксперемента советую разделить вычисления разными способами. И запускать тот или иной, например, в зависимости от аргумента командной строки. Т.к. есть вероятность, что при вычислении "в лоб" кэш-мисов больше, чем при дальнейшем вычислении с SSE.
Еще для замера производительности (и времени в т.ч.) могу посоветовать утилиту perf, умеет показывать много всего, в т.ч. и кэш-мисы.
0
|
|
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
||
| 15.10.2012, 15:21 | ||
Не сложновато ли?Мое мнение. От каждой технологии, использованной в программе, должен быть выхлоп. У вас газогидродинамика - сложные уравнения и большие матрицы. Честно говоря SSE не для больших матриц, да и потолок ускорения небольшой. SSE имеет смысл использовать для небольших внутренних вычислений вспомагательных величин, когда на лицо явно "векторные" вычисления (то есть однотипные операции над списком данных). По поводу матриц: любая, даже 5555-мерная , матрица в памяти компьютера - это одномерный вектор. Все зависит от того как вы двигаетесь по размерностям. Бывают ситуации, когда исходное представление единой трехмерной матрице (в соответствии с физической областью расчета) оказывается невыгодным. Поэтому изначально не зацикливайте себя на этом, выбирайте тот вариант представления, который будет удобен с точки зрения скорости вычислений.
0
|
||
|
4 / 4 / 0
Регистрация: 25.03.2011
Сообщений: 28
|
||||||
| 26.10.2012, 10:36 [ТС] | ||||||
|
Относительно успешно завершились игры с SSE, ниже привожу решение задачки тепловодности для кубика с изолированными стенками. Применил OpenMP и SSE, использование SSE дало ускорение в два раза, что ожидаемо. Однако есть проблема: Visual Studio прекрасно понял OpenMP и на 2 ядрах программка пошла в 2 раза быстрее, а вот gcc нее понял шутку и программа работать даже чуть медленнее.
Опции компиляции: g++ proga.cpp -fopenmp -msse -o out.out Программка: Кликните здесь для просмотра всего текста
Вопрос: где напакостил, что gcc не хочет работать?
0
|
||||||
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
||||||
| 26.10.2012, 23:38 | ||||||
|
Может стоит еще добавить флаг оптимизации?
0
|
||||||
| 26.10.2012, 23:38 | |
|
Помогаю со студенческими работами здесь
11
Вторая производная методом полинома Лагранжа Вторая производная Вторая производная Вторая производная.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|