|
4 / 4 / 0
Регистрация: 25.03.2011
Сообщений: 28
|
||||||
вторая производная с использованием SSE12.10.2012, 23:06. Показов 2691. Ответов 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 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|