|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||||||||||||||||||||||||||||||||||
Непредсказуемые изменения точности расчётов внутри kernel10.04.2024, 00:29. Показов 2923. Ответов 45
Метки нет (Все метки)
Всем доброго времени суток!
Не так много времени прошло, но я снова вынужден обратиться за помощью к сообществу. Не по теме: Ну, тут правда то ли я тупой, то ли лыжи не едут. Я ДВА ДНЯ потратил на отладку, чтобы узнать, что проблема ни разу не в моих алгоритмах - просто OpenCL'ю иногда хочется посчитать 9 знаков после запятой, а не 15. Прошу прощения. Смотрите, есть простая программа по вычислению длины отрезка дуги на поверхности сферы:
Поясняю. Вот код управляющей программы (Qt 5, CUDA 12.4, OpenCL 3.0 (auto)): Кликните здесь для просмотра всего текста
и код файла CalcDist.cl: Кликните здесь для просмотра всего текста
Если просто запустить эту программу и сравнить значения дистанции, то мы увидим
Главная причина этого в том, что значение переменной p2 оказывается таким:
Однако, если мы после основного расчёта (внутри kernel) дистанции продублируем его, разделив расчёт переменной p2 на три отдельных операции, то, О ЧУДО, вывод окажется следующим:
Не по теме: Какие-то приколы из мира Arduino, чесслово Я думал, что нашёл проблему, и заменил старые одношаговые секции кода новыми - многошаговыми. КАК же я был удивлён, когда на выходе снова получил восемь несчастных корректных знаков после запятой из 15. Отсюда и сам мой вопрос - а что, собственно, происходит? Почему, я даже не знаю, как это правильно назвать, видеокарта не хочет с первого раза нормально считать? Почему корректный расчёт происходит только при избыточном дублировании? На всякий случай, прикладываю полный консольный вывод приведённой выше программы:
Не по теме: За помощь с перевоспитанием сумасбродной видеокарты, судя по всему
0
|
||||||||||||||||||||||||||||||||||||
| 10.04.2024, 00:29 | |
|
Ответы с готовыми решениями:
45
Повышение точности расчетов Повышение точности расчетов в Matlab Уменьшение точности расчетов (округление) |
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
|
| 10.04.2024, 02:38 | |
|
1
|
|
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||||||||||||||||||||||||||
| 10.04.2024, 18:44 [ТС] | |||||||||||||||||||||||||||
|
Ситуация похожая, я бы даже сказал - та же, однако решение не приведено, к сожалению. Там люди приходят к выводу, что необходимо компилировать kernel с параметром
и никогда не существовало, судя по всему. Приведу вырезку из спецификации, прикрепив скрин ниже (или см. первый блок страницы 4 OpenCL 3.0 Reference Guide).Есть параметр
К сожалению, в обсуждении по приведённой Вами ссылке нигде не показывается момент применения параметра
Не по теме: Кроме того, я вынужден отметить, что в том обсуждении вопрошающий в целом не совсем понимает, чего хочет, поскольку выводимые его программами значения совпадают по 15 значащим цифрам, и именно такую точность гарантирует тип double. По сути, у автора вопроса не было проблем с точностью в принципе. В моём же случае бобры сгрызают 6-7 знаков из 15.
0
|
|||||||||||||||||||||||||||
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
||
| 11.04.2024, 02:33 | ||
|
Это странно, потому что поиск по этому выражению дает многовато результатов, как для несуществующего параметра.
0
|
||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||||||||||
| 11.04.2024, 10:23 [ТС] | ||||||||||||
0
|
||||||||||||
|
|
||||||
| 11.04.2024, 14:30 | ||||||
|
Ромуальд_7, когда я програмил OpenCL 1.0 я вставлял в каждый кернел такую строку:
Могу прогнать ваш готовый *.exe на Radeon 6800XT, интересно, будут ли такие же потери точности...
1
|
||||||
|
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
|
|
| 11.04.2024, 15:40 | |
|
Ромуальд_7, я где то тут писал уже, что столкнулся с тем, что видяха считает тригонометрию с низкой точностью.
Ну это и понятно, для вывода графики точности большой не нужно. Попробуй ту же программу OpenCL выполнить на процессоре, т.е. девайс подсунуть CPU вместо GPU. Интересно какие результаты будут...
0
|
|
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||
| 11.04.2024, 17:23 [ТС] | |||
|
snake32, да, эта строка, к сожалению, ничего не изменила.
А можете ли Вы просто взять мой kernel и вставить в одну из Ваших хостовых программ? Дело в том, что я прогаю на Qt, а с точки зрения сборки проекта в один .exe для исполнения на машине без Qt под Windows это — головная боль. Нужно собирать в статику, но я не знаю, что там по OpenCL в статических сборках. На линуксе как-то поудобнее это реализовано. Не по теме: Я пока не умею в распространение на мультиплатформе, уж простите :)
0
|
|||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||||
| 12.04.2024, 16:47 [ТС] | ||||||
|
Товарищи, новый симптом!
В представленном мной выше kernel-коде есть строки (69 - 77)
Я закомментировал строки печати p2_h1 и p2_h2, и p2_sum стала считаться неточно. p2_sum вновь начинает считаться точно, если оставить печать хотя бы одной промежуточной переменной. В связи с этим новый вопрос - GPU всегда ведёт себя как лентяй - делает плохо, пока никто не смотрит? Нет, ну правда - что это?
0
|
||||||
|
|
||||||||||||
| 17.04.2024, 18:31 | ||||||||||||
|
Набросал проектик.
Максимальная разница OpenCL vs CPU x86_64 4.50651360534016E-8 километров. То есть меньше 0,1 мм на поверхности Земли. Ромуальд_7, куда ещё точнее то? Код ядра OpenCL:
2
|
||||||||||||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|
| 17.04.2024, 20:37 [ТС] | |
|
snake32, к сожалению, не всё так просто. Эта функция в вакууме действительно выдаёт более, чем приемлемые результаты, но дело в том, что это — лишь ядро моей большой программы, которое вызывается миллионы раз за один прогон. Это ядро сверху обёрнуто некоторым количеством проверок в виде дополнительных операций, и в результате при некоторых трудноуловимых, но катастрофичных сценариях точность падает до третьего знака после запятой (а у меня проверка стоит именно по третьему знаку — дальше некуда — будут ложные срабатывания). В какой-то момент kernel просто виснет в цикле while, не пройдя проверку на выход из него; в этом случае разница между GPU и CPU составляет 14 знаков (была дооооолгая отладка). Отмечу, что среднее рассогласование в ответственный момент варьируется от 7 правильных знаков после запятой, до уже упомянутых трёх.
На самом деле, причина даже ясна — в функции расчёта дистанции есть часть .. cos(delta_lambda), и думается мне, что в какой-то момент оптимизированная компилятором функция не видит разницы между cos(0.000000032467178) и cos(0), и пожалуйста — точность 7 знаков, которая далее после пяти операций упадёт до 3.Мой основно вопрос в том ведь, как заставить kernel работать так, как он может работать. На тестовом примере (приведённом здесь) УДАЁТСЯ заставить GPU правильно всё посчитать, разбив операцию на три элементарных и прописав флаг -cl-opt-disable, но это не работает на большой программе — цифры идут другие, но в равной степени неправильные.
0
|
|
|
|
||
| 17.04.2024, 20:59 | ||
|
Ромуальд_7, можешь мой экзешник запустить?
Кстати, на домашнем ПК GPU Radeon 6800XT чуть хуже точность. А на 5950Х одинаковое, но оно и понятно драйвер OpenCL один и тот же стоит от Intel
1
|
||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||
| 17.04.2024, 23:38 [ТС] | ||||
|
Что-то мне жёстко не нравится - разница вдвое. Кстати, мой 5900x прога не увидела, а Ваш 5950x - шмогла. С этой точки зрения, числа 1,2345678987654'321 и 1,2345678987654'999 отличаются достаточно, чтобы что-то где-то посчиталось неправильно.Не по теме: Я бы, откровенно, плясал, если бы GPU начала выдавать хотя бы 10 совпадающих с CPU знаков 9,013..E-8?
0
|
||||
|
|
|||||
| 18.04.2024, 11:18 | |||||
|
Лучше пусть работает менее точно, но стабильно везде, чем местами точнее, но не стабильно. Надо исходные данные изменить, у меня минимум 100м между точками, и в большинстве случаев именно в этом месте максимальная погрешность, кроме Radeon, у него на 3 точке макс погрешность(i=3). Чуть позже сделаю чтобы с нуля тестило. Я ставил драйвер от Intel 2016 года, но из-за него могут другие OpenCL-устройства отвалится. Например видеокарта - придётся сверху переставить драйвер ВК. Если для вас это не проблема можете скачать OpenCL драйвер здесь Добавлено через 53 секунды
1
|
|||||
|
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
|
||
| 18.04.2024, 11:28 | ||
|
Я конкретных значений не сравнивал, считал интерференционную картину в оптике, так на видяхе картинка была "рваная", а на ЦПУ плавная. Похожее было когда рисовал фрактал, сначала в точности float, потом пришлось перейти на double. Ромуальд_7, может стоит попробовать считать тригонометрию самому с помощью рядов, а не использовать встроенные функции. Заодно убедиться, что проблема именно в этом, и оценить падение быстродействия на этом.
1
|
||
|
|
|||
| 18.04.2024, 11:59 | |||
|
А если я перепишу алгоритм вычислений расстояний на сфере с double на float то разница будет 2 км (уже проверял, давно), а тут дельта миллиметры, на расстояниях от 100 метров до 20 км. Можно отказаться от тригонометрии в пользу векторной математики, но тогда 1) хранить вершины как единичные 3D-вектора (это + 50% памяти, так как вместо 2 double'ов надо юзать 3 на вершину) 2) придётся постоянно конвертировать из 3D-декартовой в сферическую и обратно 3) всё рано для расчёта расстояния потребуется arccos, ну хотя бы он будет 1 По-хорошему надо и такую серию тестов на точность и скорость делать.
1
|
|||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||||||||||
| 18.04.2024, 13:28 [ТС] | |||||||||||
![]() double, а float - там, где раньше я был недоволен третьим знаком после запятой, теперь вообще другие числа идут; прям настолько другие значения, что об их точности в сравнении с CPU даже речи идти не может. Я ничего не понимаю. В вычислительных шейдерах OpenGL на float'e я, хотя бы, что-то вменяемое получал (в точно таком же алгоритме), а тут просто комшар какой-то. И хоть с флагом -cl-opt-disable собирай, хоть с чем - без разницы.math.h на 17% (на CPU). Я был очень горд собой, пока не обнаружил, что шейдерами-то я не воспользуюсь нифига xD
0
|
|||||||||||
|
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
|
||
| 18.04.2024, 14:18 | ||
0
|
||
|
|
|||
| 18.04.2024, 17:34 | |||
|
0
|
|||
| 18.04.2024, 17:34 | |
|
Помогаю со студенческими работами здесь
20
Построить график изменения вероятности нахождения в состояниях со временем (по результатам расчетов)
Непредсказуемые синие экраны Stripos - непредсказуемые результаты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|