Float vs double на графическом оборудовании

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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