Мне нужно использовать 128-битные числа с плавающей запятой и комплексные числа в параллельных вычислениях на графическом процессоре с использованием OpenCL или CUDA.
Есть ли способы добиться этого, не реализуя это самостоятельно?
Я посмотрел спецификации OpenGL и CUDA и не нашел там поддержки float128, неужели мне невозможно использовать в них float128? Я пытался искать какие-нибудь библиотеки, но кажется, что их не существует, так ли это?
По крайней мере, я хотел бы иметь возможность использовать float128, возможно ли этого добиться?
@JérômeRichard, ну, это очень грустно. Нет ли сторонних решений для этого?
Кстати, результирующая ошибка на 128-битных числах при эмуляции должна быть значительно выше, чем указано в стандарте IEEE (например, десятки ULP). Если вам нужны 100% точные 128-битные числа IEEE, то замедление будет даже выше, чем упомянутое выше.
Вероятно, было бы проще эмулировать 128-битную или более арифметику с фиксированной запятой, используя 32-битные целочисленные математические вычисления, если это разумный вариант.
float128 (и выше) представляет собой долю меньшинства. Что вы пытаетесь сделать в CUDA, для чего они нужны? Возможно, есть и другие способы решения вашей проблемы.
В последний раз, когда я смотрел, я нашел этот проект. Я не проверял, но думаю, что логику можно портировать на OpenCL/CUDA и на 128-битную (с 64-битной) вместо 64-битной (с 32-битной). Однако имейте в виду, что в большинстве случаев 128-битные числа на самом деле не нужны. Часто можно повысить численную стабильность алгоритмов, поэтому 64-битной версии достаточно. 64-битные числа могут хранить расстояние между Землей и Луной с точностью <0,1 мкм, что безумно и, безусловно, намного превосходит точность, которую мы можем получить от всех систем измерения). Вам действительно это нужно?
@JérômeRichard Иногда они полезны для вычисления точных эталонных значений, которым можно доверять в тестовых примерах, целью которых является получение правильного ответа с двойной точностью для очень неудобных числовых задач. То же самое и с более высокой точностью, но обычно вас не волнует скорость при расчете нескольких тестовых случаев.
@MartinBrown, я пытаюсь нарисовать множество Мандельброта, и по мере увеличения масштаба двойное число очень быстро исчезает, мне нужно больше чисел после точки.
Возможно, вам будет лучше использовать векторный код AVX с FMA и парами тщательно выбранных двойников, чтобы представить центр плитки и ее диапазон x и y.
Я также считаю, что арифметика с фиксированной запятой — лучший выбор, потому что float128
будет недостаточно в зависимости от глубины масштабирования. Существует библиотека CUDA для больших чисел (CGBN), которая позволяет варпам сотрудничать при выполнении операций с большими числами, т. е. обеспечивает больший параллелизм с более высокой точностью.
См. также комментарии ниже Увеличение точности с плавающей запятой для построения фрактала Мандельброта с использованием графического процессора (что является своего рода дубликатом, но также остается без ответа и задается в контексте Python/Numba).
Ни один из современных графических процессоров/процессоров не поддерживает FP128. Графические процессоры имеют схему только для FP32 и очень ограниченную поддержку FP64. Ни OpenCL, ни CUDA не поддерживают FP128.
Вам придется реализовать формат самостоятельно, преобразование и арифметика эмулируются как структура из двух 64-битных целых чисел. То же самое для комплексных чисел.
У меня есть сверхбыстрые алгоритмы преобразования FP16<->FP32 здесь, они адаптируются к FP64<->FP128. Для арифметики вам нужно найти решение.
Зачем вообще нужны 34 десятичных цифры? Есть ли способ сделать то же самое с FP64? Довольно часто вы можете использовать числовые трюки, чтобы избежать исчезновения цифр в форматах с более низкой точностью.
Также обратите внимание на форматы Posit. Если ваше приложение выполняет только арифметические действия, близкие к числу 1, 64-битный Posit гораздо более эффективен, чем FP64, и может быть достаточно хорош.
Вопрос:
«Мне нужно использовать 128-битные числа с плавающей запятой и комплексные числа в параллельных вычислениях на графическом процессоре с использованием OpenCL или CUDA.
Есть ли способы добиться этого, не реализуя это самостоятельно? "
Нет.
Не в третьем квартале 2024 года,
не считая FPGA или SoC или смелых любителей, реанимировавших Transputer Fabrics, обходные пути для других возможных аппаратно-параллельных способов.
После множества ложных обвинений, растущих ниже, позвольте мне повторить - Ответ посвящен тому, ПОЧЕМУ это плохая идея использовать представления чисел FP в арифметических методах, которые помогают решить любую важную вещь.
Я работал над проектированием компонентов реакторного отсека атомных электростанций, над аэрокосмическими конструкциями, над математическими методами надежного решения задач оптимизации с точностью выше 200 (и все еще) допустимых цифр, решая динамические системы, которые ведут себя аналогично детерминированным псевдохаотическим системам, или над использование вычислительных моделей FEM, чтобы избежать сбоев в конструкции, всего, что не ухудшается и не должно ухудшаться из-за плохого обращения (или вообще необработки, как во многих «быстрых» решателях CFD) числовых методов и подобных случаев, когда числовое представление решает успех от неудач (красивые картинки о физической глупости не являются надежными результатами в жизненно важных дисциплинах).
Картинки могут порадовать необразованный глаз, но если наука серьезно относится к значениям (неотделимым от соответствующего ДИАПАЗОНА ОСНОВНОЙ неопределенности - не только для измеренных значений, даже самые известные значения основных констант вводят ДИАПАЗОН ОСНОВНОЙ неопределенности ~ +/- 1E-8 ), многие алгоритмы вскоре дают результаты типа N +/- oo !
Ага
Профессор Поспишил, советник нескольких президентов США, обычно утверждал:
"Серьезная наука создает понимание (основанное на повторяемых экспериментах).
Это позволяет делать обобщения".
"@MartinBrown , я пытаюсь нарисовать множество Мандельброта, и по мере увеличения масштаба двойное значение очень быстро пропадает, мне нужно больше чисел после точки.
– German Commented 18 hours ago"
By Claude Heiland-Allen - Own work, CC BY-SA 4.0,
https://commons.wikimedia.org/w/index.php?curid=47022590
Сначала факты:
(a)
Множество Мандельброта — это не «картинка», какой мы ее знаем, это бесконечно сложный математический объект, который имеет удивительно тривиальную итеративную формулировку, однако проблемы (как вы заметили) начинаются, как только мы пытаемся каким-то образом создайте его визуальное (упрощенное) представление, тем более, что вы пытаетесь «нырять» все глубже и глубже, поскольку аппаратные ограничения представления чисел начинают создавать для нас проблемы, чтобы все же вычислить хоть как-то значимые значения.
(б)
Как Кан доказал в 2001, множество Мандельброта плавно связно (!) в топологическом смысле, поэтому попытки «растрировать» его упрощенное визуальное представление в 2D-сетку создают все больше и больше проблем на более мелких и более мелкие уровни детализации (еще больше усложняет необходимость разумного представления чисел, поэтому проблемы, уже содержащиеся в объявлении (а), становятся еще больше).
(c)
Поскольку множество Мандельброта является абстрактным объектом, оно не имеет каких-либо ограничений физического мира (например, прохождения планковской длины или удара головой о главную границу принципа неопределенности Гейзенберга), поэтому огромные, принципиально бесконечные глубины Уровня Деталей невозможно избежать.
Хорошие новости :
Простота вашего выбора - используя только итератор определения членства в множестве Мандельброта, который проверяет созданное итератором значение на соответствие заданному порогу отказа, вам не нужно ничего более сложного, чем ADD()
-, SUB()
- и MUL()
- алгебраические методы реализовано (чтобы использовать любой вид представления чисел по вашему дальнейшему выбору... в этот момент вы уже должны были осознать, что, поскольку float64 скоро ухудшится, то же самое будет и с float128, и собственное представление числа будет единственным путем вперед для «более глубокого» увеличения при построении графиков двумерных сечений множества Мандельброта).
Независимо от того, какое пользовательское представление чисел вы выберете, итератор, определяющий членство, просто использует эти простые вычисления, полученные из стандартной записи итеративного генератора
( zn+1 = zn2 + c ):
z_RE := c_RE + ( z_RE + z_IM ) * ( z_RE - z_IM )
z_IM := c_IM + ( z_RE * z_IM * 2 )
и проверьте, если:
( z_RE * z_RE + z_IM * z_IM ) > a_giveup_threshold_SquaredCONST
Итак, нам нужно всего лишь:
8 регистров (экземпляры ( almost ) хранилища бесконечной точности — здесь наш предел — только [SPACE]), и
4 операции (ADD, SUB, MUL, >), которые можно составить из 64-битных, 32-битных или даже 16-битных аппаратных операций на разумно используемых битовых полях.
Для этого использовалась программа по математике первого года обучения в средней школе, лицее или средней школе (названия школ различаются в разных культурных и образовательных системах разных стран), где полиномы преподавали даже для порядкового деления (чего мы не делаем). нужно здесь), — это все, что вам нужно для создания тривиального или более сложного (переменной длины) представления чисел, которое можно было бы обрабатывать параллельно, с умным использованием выбранных SIMD-инструкций (даже на графическом процессоре).
Плохие новости :
Использование хороших инструментов для задач, для которых они были изобретены, обычно помогает нам получить результаты в этой проблемной области. Использование инструмента, который подходит для чего-то другого, кроме того, что нам нужно решить, не обязательно поможет нам легче решить нашу проблему.
Это относится к оператору O/P.
«(...) используйте 128-битные числа с плавающей запятой и комплексные числа в параллельных вычислениях на графическом процессоре с использованием OpenCL или CUDA».
SM-движки графического процессора, CUDA, OpenCL были разработаны для обеспечения быстрого выполнения тривиальных математических ядер, выполнения преобразований таких вещей, как 8-битные цветовые плоскости RGB (текстурирование, локальное сглаживание и т. д.).
Если бы мы набрали это :
Написано: "Он сказал, что хочет, чтобы это произошло с ним. كل الأشياء تشبه المسمار..."
используя болгарскую, санскритскую или подобную клавиатуру,
мы потерпим неудачу,
как и при попытке «заставить» графический процессор начать работать со значениями Complex128 или Float128 так же эффективно, как он работает с 4-битными (в выводе TPU) или аналогичным образом с фиксированной разрядностью, оптимизированными на -плата СМ + аппаратная память + преобразователи языка программирования.
Все это не означает, что вы не можете получить ( almost ) бесконечно глубокие виды секций множества Мандельброта.
Вам просто нужно будет разработать смарт-код для { ADD, SUB, MUL, < }
-операторов для вашего нового, настраиваемого представления чисел, который не будет ухудшаться при более глубоком увеличении.
Все это выполнимо, используя представление чисел фиксированной или даже переменной длины, даже для переноса на COTS-фабрики графических процессоров, но также имейте в виду, что, поскольку вы, скорее всего, все равно будете прибегать к некоторому дискретному покрытию точек внутри увеличенном 2D-секции, графический процессор не повысит производительность, как вы ожидаете, поскольку когерентность потоков по определению скоро выведет ваши потоки по всей варпу из режима «Когерентного планировщика», и потоки в основном завершатся через расходящийся режим (так как «пробег» их итератора будет сильно различаться), поэтому планировщик SM графического процессора вскоре перейдет в так называемый «жадный режим», где оборудование, оптимизированное для маскировки задержки, будет работать намного хуже, чем в «когерентном режиме». «Обработка чисел SIMD в масштабах всей варпа (Закон Амдала и детали маскировки задержки графического процессора имеют большое значение).
Бонусная часть:
Мои первые эксперименты по реализации Мандельброта и наивному представлению чисел начались около 40 лет назад на 8-битных транспортных средствах Commodore C-128 (128 КБ ОЗУ в те дни было роскошным пространством (!)) и ZX Spectrum сэра Клайва Синклера (48 КБ ОЗУ). , оба используют PAL-TV в качестве дисплея.
Сегодня, используя синтаксис:
ffplay -f lavfi \
-fs -i mandelbrot \
-vf "format=gbrp,split=4[a][b][c][d],[d]histogram=display_mode=0:level_height=244[dd],[a]waveform=m=1:d=0:r=0:c=7[aa],[b]waveform=m=0:d=0:r=0:c=7[bb],[c][aa]vstack[V],[bb][dd]vstack[V2],[V][V2]hstack"
мы можем сделать гораздо больше и раскрыть новые уровни детализации и продемонстрировать дальнейшие проблемы:
Хотя это кажется хорошим ответом на процитированный комментарий, он, вероятно, не будет иметь большой ценности для тех, кто найдет «Как использовать 128-битные числа с плавающей запятой и комплексные числа в OpenCL/CUDA?». И поскольку по этому аспекту уже есть другой ответ, редактирование комментария в вопросе (аннулирование этого ответа) также не является хорошим вариантом. Я бы предложил перенести этот ответ на более старый вопрос без ответа, который я связал в комментарии. Там это было бы уместнее.
Лол, успокойся. Я только что увидел отрицательную оценку этого ответа, над которым вы, кажется, вложили некоторую работу. Я не отмечал ваш ответ и не голосовал за него, поэтому понятия не имею, как вам пришла в голову мысль, что я буду вас подвергать цензуре. Я просто подумал о том, почему люди не могут проголосовать за этот ответ (или даже проголосовать против него), и пришел к выводу, что это должно быть связано с отсутствием темы масштабирования Мандельброта в самом вопросе. И поскольку я предпочел бы, чтобы за него проголосовали, и я нашел этот вопрос без ответа, я попытался донести до вас свою мысль. Если вас устраивает нынешнее положение дел, пусть будет так.
Я написал, что редактировать вопрос, чтобы он лучше соответствовал вашему ответу, — не лучший вариант. Я не писал, что не следует добавлять ответы на уже отвеченные вопросы.
Если предположить, что только небольшая часть людей, заинтересованных в использовании арифметики с плавающей запятой 128b на графических процессорах, также заинтересована в масштабировании Мандельброта, большая часть этих людей не будет заинтересована в большей части вашего ответа (что меня устраивает, но может быть плохо для ответа). забить, однако). Я вообще не заставляю вас удалять этот ответ. Все, что я говорю, это то, что если бы я прочитал этот ответ под другим вопросом, я бы проголосовал за него.
@paleonix Что вы считаете «редактированием вопроса (чтобы он лучше соответствовал вашему ответу)»?
В основном редактирую дополнительную информацию, которую ОП предлагает в комментариях. Пока не было ответов на исходный вопрос, можно было бы отредактировать его специально для масштабирования Мандельбротта (или попросить ОП сделать это). Дело в том, что вопросы и ответы StackOverflow в первую очередь направлены не на помощь автору вопроса (что является приятным побочным эффектом), а на представление информации будущим читателям. Поэтому оценка ответов будет зависеть от согласованности вопроса и ответа без учета комментариев, даже если ваш ответ был более полезен для ОП.
Ага - под «редактированием» @paleonix, похоже, подразумевалось «копировать/вставить 1:1 то, что указал O/P». Да, я копирую/вставляю важную часть того, что спрашивал О/П. Обычно принято обращаться как можно ближе к теме, которую задали. Даже профессор видел это, прежде чем опубликовать «ответ» на что-то другое, чем было задано (О/П никогда не проявлял интереса к вычислению чисел только в непосредственной близости от 1). И последнее, но не менее важное: первые два десятилетия контента, спонсируемого сообществом, были посвящены ответам на вопросы O/P. Если это изменится, будущее покажет нам, был ли это хороший шаг.
Но вопрос ОП не о множестве Мандельброта. К лучшему или к худшему, вы ответили на то, что, по вашему мнению, должен был быть вопрос ОП. Часть ответа, относящаяся к самому вопросу, незначительна (должен был быть комментарий).
Нет, вопрос ОП об использовании 128-битного представления чисел для вычислений (Мандельброт + в принципе любые числовые вычисления). Ответ посвящен тому, ПОЧЕМУ использовать представление чисел FP в арифметических методах, которые помогают решить любую важную вещь, — плохая идея. Картинки могут порадовать необразованный глаз, но если наука серьезно относится к значениям (неотделимым от соответствующего ДИАПАЗОНА ОСНОВНОЙ неопределенности - не только для измеренных значений, даже самые известные значения основных констант вводят ДИАПАЗОН ОСНОВНОЙ неопределенности ~ +/- 1E-8 ), многие алгоритмы вскоре дают результаты типа N +/- oo ! Ага
AFAIK не имеет стандартной поддержки 128-битных чисел FP на графических процессорах Nvidia. Фактически, клиентские графические процессоры оптимизированы для <= 32-битных чисел FP и очень медленны для 64-битных. Однако серверные графические процессоры могут эффективно вычислять 64-битный FP. Чтобы получить 128-битные версии, вам нужна своего рода эмуляция, которая обычно очень медленная, примерно в >=32 раза медленнее, чем 64-битная (которая уже обычно >=32 раза медленнее на клиентских графических процессорах и >=2x на серверах). Короче говоря: вам следует избегать этого, насколько это возможно, ради производительности, и если вам это действительно нужно, попробуйте эмуляцию.