float vs double на графическом оборудовании - PullRequest
23 голосов
/ 17 января 2010

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

Я пишу код с помощью OpenGL, поэтому, если есть какая-то информация, относящаяся к этому API, которая, по вашему мнению, должна быть известна, давайте рассмотрим ее.

Я понимаю, что если программа перемещает большое количество данных в / из графического оборудования, то, вероятно, было бы лучше использовать плавающие значения, так как удваивание потребовало бы удвоенной пропускной способности. Мои вопросы больше направлены на то, как графическое оборудование выполняет их обработку. Насколько я понимаю, современные процессоры Intel преобразуют float / double в 80-битный вещественный код для вычислений (за исключением инструкций SSE), поэтому оба типа работают примерно одинаково быстро. Современные видеокарты делают что-то подобное? примерно равны ли поплавок и двойная производительность? Есть ли веские причины использовать один над другим?

Ответы [ 4 ]

25 голосов
/ 17 января 2010

С точки зрения скорости, графические процессоры оптимизированы для поплавков. Я намного лучше знаком с аппаратным обеспечением Nvidia, но в оборудовании текущего поколения есть 1 DP-FPU на каждые 8 ​​SP-FPU. В оборудовании следующего поколения они, как ожидается, будут иметь большее соотношение 1: 2.

Я бы посоветовал посмотреть, нуждается ли ваш алгоритм в двойной точности. Многие алгоритмы не нуждаются в дополнительных битах. Запустите несколько тестов, чтобы определить среднюю ошибку, которую вы получите, перейдя на одинарную точность и выяснить, является ли она существенной. Если нет, просто используйте сингл.

Если ваш алгоритм предназначен исключительно для графики, вам, вероятно, не нужна двойная точность. Если вы выполняете вычисления общего назначения, рассмотрите возможность использования OpenCL или CUDA.

5 голосов
/ 17 января 2010

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

Из записи в GPGPU в Википедии:

Реализации с плавающей запятой на графических процессорах Nvidia в основном соответствуют IEEE; Однако это не относится ко всем поставщикам. Это имеет значение для правильности, которые считаются важными для некоторых научных приложений. Хотя 64-битные значения с плавающей запятой (с плавающей запятой двойной точности) обычно доступны на процессорах, они не всегда поддерживаются на графических процессорах; некоторые архитектуры GPU жертвуют IEEE-совместимостью, в то время как другим не хватает двойной точности. Были попытки эмулировать значения с плавающей запятой двойной точности на графических процессорах; тем не менее, компромисс между скоростью сводит на нет любые преимущества, прежде всего, для выгрузки вычислений на графический процессор.

4 голосов
/ 17 января 2010

Большинство графических процессоров вообще не поддерживают двойное плавание. Поддержка была добавлена ​​совсем недавно (это поколение), а не везде:

  • ATI:
    • HD5870 и HD5850 имеют его на приличной скорости (хотя и не так быстро, как одиночный)
    • HD5770 имеет нет , несмотря на то, что находится в том же поколении, что и HD5870.
  • Nvidia:
    • GT200 имеют двойную поддержку, но с двойным / единичным соотношением, которое очень низкое. (Соотношение 8: 1?)
    • Предполагается, что у Ферми его будет на половине скорости одиночного ... Когда бы он ни отправлялся.

Для всего остального, у вас просто нет двойной поддержки.

Итак ... Вы не должны использовать double, если вам это не нужно.

3 голосов
/ 17 января 2010

Двойные значения не поддерживаются для рендеринга до DX11: (т.е. модель шейдера 5)

http://msdn.microsoft.com/en-us/library/ee418354(VS.85).aspx

Я подозреваю, что OpenGL будет таким же.

...