2009-09-18 4 views
7

Я заинтересован в реализации алгоритма на GPU с использованием HLSL, но одна из моих основных проблем заключается в том, что мне нужен переменный уровень точности. Существуют ли методы для эмуляции 64-битной точности и выше, которые могут быть реализованы на графическом процессоре.высокоточная математика на GPU

Спасибо!

ответ

10

Графические процессоры только начинают поддерживать двойную точность в оборудовании, хотя в ближайшем будущем оно будет оставаться намного медленнее, чем одинарная. На протяжении многих лет разрабатывается множество методов, позволяющих синтезировать более плавную точку с высокой точностью, используя представление, состоящее из нескольких поплавков, при любой точности имеет быструю аппаратную поддержку, но накладные расходы довольно значительны. IIRC, руководство crlibm имеет довольно хорошее обсуждение некоторых из этих методов с анализом ошибок и псевдокодом (CRLIBM использует их для представления чисел как более одного значения двойной точности, но те же самые методы могут использоваться с одиночными)

Не зная больше о том, что вы пытаетесь сделать, трудно дать лучший ответ. Для некоторых алгоритмов только одна небольшая часть вычислений требует высокой точности; если вы в таком случае, возможно, вы сможете получить достойную производительность на GPU, хотя код не обязательно будет очень красивым или легким в работе. Если вам нужна высокая точность повсюду в вашем алгоритме, тогда графический процессор, вероятно, не является привлекательным вариантом для вас на данный момент.

И, наконец, почему HLSL, а не язык, ориентированный на вычисления, такой как CUDA или OpenCL?

+0

Код предназначен для обработки итерационных фрактальных систем, поэтому он должен иметь высокую точность последовательно. Я ищу увеличение производительности по сравнению с обработкой на процессоре. И что касается CUDA и OpenCL, я просто знаком с HLSL atm. Хотя я собираюсь сделать это в CUDA. Раньше я учился в CUDA, но я не могу сказать, что я где-то рядом умею. – Mark

+2

Если вам нужна высокая точность последовательно, в настоящее время, вероятно, невозможно превзойти хорошо написанный код, запущенный на CPU. Возможно, ваше время лучше потрачено на выполнение профилирования на CPU и настройку производительности. –

+0

Не то, чтобы писать код GPGPU не стоит на его собственных достоинствах, просто вы действительно хотите выбрать что-то, где вы не будете пытаться сделать аппаратное обеспечение тем, для чего оно не предназначено. –

0

ATI Stream SDK поддерживает Собственная двойная точность, но это не HLSL.

Уловов таковы:

  • не все графические процессоры имеют двойную точность оборудования, только более дорогие карты, такие как HD 4870
  • не все операции с двойной точностью доступны. Например, никакой инструкции деления.

OpenCL будет поддерживать двойную точность как расширение, но это все еще в бета-версии.

+0

OpenCL не находится в бета-версии; некоторые отдельные реализации спецификации находятся в бета-версии, но OpenCL - это стандартная, а не конкретная реализация. Существует также не-бета-версия для OSX в SnowLeopard. –

+0

@stephentyrone. Ты прав. Но насколько я знаю, все * реализации * OpenCL, которые поддерживают двойную точность * на GPU * (а не на процессоре), все еще находятся в разработке. У меня нет непосредственных знаний о том, что есть и не поддерживается в SnowLeopard. Если я дезинформирован, пожалуйста, напишите подробности. –

5

Используя два поплавка (то есть значения одиночной точности), вы можете достичь около 56 бит точности. Это приближается к точности двойника, но многие из операций, которые вы можете реализовать для этого «двойного одиночного» типа данных, являются медленными и менее точными, чем использование удвоений. Однако для простых арифметических операций они обычно достаточны.

Этот paper немного рассказывает об этой идее и описывает, как реализовать операцию умножения. Для получения более полного списка операций, которые вы можете выполнить и как их реализовать, ознакомьтесь с пакетом DSFUN90 here. Пакет написан на Fortran 90, но может быть переведен на все, что имеет номера с одной точностью. Имейте в виду, что вы должны лицензировать библиотеку у них, чтобы использовать ее в коммерческих целях. Я считаю, что демо-приложение Mersenne-Twister CUDA также имеет реализации для операций сложения и умножения.

+0

Я не вижу ничего подобного в демонстрации SDK Mersenne Twister в CUDA 4.2+. –

2

Это ответ немного не по теме, но если вы хотите увидеть, как ваша проблема будет влияние переключения некоторых операций в одинарной точности арифметики, вы должны думать об использовании интервальной арифметики эмпирически измерить границы неопределенности, когда вы смешиваете точность по-разному.Boost имеет интервальную арифметическую библиотеку, которую я когда-то использовал для создания существующего научного кода C++: он был довольно прост в использовании.

Но будьте осторожны: интервальная арифметика, как известно, пессимистична: то есть она иногда преувеличивает границы. Предполагается, что аффинная арифметика будет лучше, но я никогда не нашел для нее полезной библиотеки.

Смежные вопросы