высокая точность математики на GPU - PullRequest
7 голосов
/ 18 сентября 2009

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

Спасибо!

Ответы [ 4 ]

10 голосов
/ 18 сентября 2009

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

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

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

5 голосов
/ 28 сентября 2009

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

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

2 голосов
/ 30 ноября 2009

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

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

0 голосов
/ 22 сентября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...