Хорошо, я знаю, что float16
не является настоящим примитивным типом, но он моделируется Python/numpy. Однако возникает вопрос: если это существует и Python позволяет использовать его при умножении массивов с помощью функции numpy.dot()
, то почему OpenBlas (или ATLAS) не работает должным образом? Я имею в виду, что умножение работает, а параллельные вычисления — нет. Или, по-другому (на мой взгляд, лучше), почему Python/numpy позволяет использовать float16
, если тогда мы не можем использовать расширенные функции, предлагаемые OpenBlas/ATLAS?
Почему numpy.float16 нарушает функциональность OpenBlas/Atlas?
Ответы (1)
Numpy float16
— странный и, возможно, злой зверь. Это число с плавающей запятой половинной точности IEEE 754 с 1 битом знака, 5 битами экспоненты и 10 битами мантиссы.
Хотя это стандартное число с плавающей запятой, оно появилось недавно и широко не используется. Некоторые графические процессоры поддерживают его, но аппаратная поддержка не распространена в процессорах. Новые процессоры имеют команды для преобразования между 16-битными и 32-битными числами с плавающей запятой, но не поддерживают их непосредственное использование в математических операциях. Из-за этого, а также из-за отсутствия подходящих типов данных в распространенных языках нижнего уровня, 16-битное число с плавающей запятой используется медленнее, чем его 32-битный аналог.
Только несколько инструментов поддерживают это. Обычно 16-битное число с плавающей запятой рассматривается как формат хранения, который затем перед использованием преобразуется в 32-битное число с плавающей запятой.
Некоторые ориентиры:
In [60]: r=random.random(1000000).astype('float32')
In [61]: %timeit r*r
1000 loops, best of 3: 435 us per loop
In [62]: r=random.random(1000000).astype('float16')
In [63]: %timeit r*r
100 loops, best of 3: 10.9 ms per loop
В качестве общего использования не используйте его ни для чего другого, кроме как для сжатого хранилища. и даже тогда знайте о компромиссе:
In [72]: array([3001], dtype='float16') - array([3000], dtype='float16')
Out[72]: array([ 0.], dtype=float32)
float16
типы. Честно говоря, это сводило меня с ума... в конце концов я обнаружил, что это проблема примитивного типа. Я думаю, что документация numpy должна сообщать, что может работать, а что нет.
- person f_ficarola; 06.07.2014
scipy.ndimage.gaussian_filter1d
(и функции, которые его используют) прерываются наnp.float16
. Не уверен, как этот тип данных закодирован, но ваша проблема, похоже, не единственная. - person eickenberg   schedule 05.07.2014