СФ предназначен для «быстрых приближенных трансцендентных операций»
SFUs вычислительных функции, как __cosf()
, __expf()
и т.д.
С другой стороны, здесь говорится, что они работают только в одинарная точность, это все еще правильно на K20Xm?
Согласно последним CUDA C Programming Guide, section G.5.1, они все еще работают только с одной точностью.
Это имеет смысл, поскольку, если вам нужна двойная точность, вряд ли вы будете использовать неточные математические функции. Вы можете обратиться к this answer за предложениями относительно арифметических оптимизаций с двойной точностью.
Детали реализации операций двойной точности можно найти в /usr/local/cuda-5.5/include/math_functions_dbl_ptx3.h
(или там, где установлен ваш CUDA Toolkit). . для sin
и cos
он использует сокращение аргумента Payne-Hanek, за которым следует расширение Тейлора (до порядка 14).
Для двойных расчетов точности, SFUs, кажется, только в __internal_fast_rcp
и __internal_fast_rsqrt
, что, в свою очередь, используются в acos
, log
, cosh
и несколько других функций (см math_functions_dbl_ptx3.h
). Поэтому большую часть времени они останавливаются, например, блокировки LD/ST, если нет текущих транзакций памяти.
Следует ли загружать/записывать любую информацию из одного из тезисов?
Да, каждый доступ к глобальной памяти.
И используются ли они в качестве единственной основы? Другими словами, может быть только одна деформация, которая в настоящее время пишет или читает?
Число единиц ограничивает только количество инструкций, выданных за каждый цикл. То есть может быть выдан каждый 32-битный тактовый цикл, и 32 результата могут быть возвращены.
Одна инструкция может считывать/записывать до 128 байт, поэтому, если каждый поток в warp считывает 4 байта, и они объединены, то для полного преобразования требуется одна команда загрузки/хранения. Если доступ не развязан, тогда необходимо выдать больше инструкций.
Кроме того, единицы измерения - pipelined, что означает, что несколько запросов чтения/хранения могут выполняться одновременно одним блоком.
Каким образом графические процессоры NVIDIA обрабатывают трансцендентные функции с двойной точностью? Это интересный вопрос, который я раньше не рассматривал. Надеюсь, кто-то может ответить. Если нет, я думаю, что мы можем сделать довольно хорошее предположение после измерения пропускной способности и количества действительных битов в результатах. –
@RogerDahl SFUs работают только с одной точностью, как указано ниже. Их аппаратная реализация основана на квадратичной интерполяции в таблицах ROM с использованием арифметики с фиксированной точкой, как описано в статье _Stuart F. Oberman и Michael Siu. Высокопроизводительный многофункциональный многофункциональный интерполятор. В материалах 17-го симпозиума IEEE по компьютерной арифметике (Cap Cod, USA), стр. 272-279, июль 2005 г._ Это ответ, который njuffa дал мне некоторое время назад на форуме NVIDIA, см. [Специальные функции Fermi и Kepler GPU] (https://devtalk.nvidia.com/default/topic/531855/?comment=3746296). – JackOLantern