NumPy-QuadDType (
numpy_quaddtype
) — это реализация пользовательского типа данных (dtype
) для NumPy, которая обеспечивает настоящую арифметику с плавающей точкой четверной точности на разных платформах. Проект направлен на решение давних проблем с
np.longdouble
, предлагая согласованный, высокоточный тип с плавающей точкой независимо от базовой архитектуры системы, а также обеспечивая обратную совместимость long double
.Ядро numpy_quaddtype построено вокруг на двух ключевых компонентов:
QuadPrecision
, представляющий отдельные скаляры четверной точности;QuadPrecDType
, позволяющий использовать эти скаляры четверной точности в массивах и операциях NumPy.Отличительная черта numpy_quaddtype - его подход с двойным бэкэндом:
Sleef_quad
из библиотеки SLEEF, предоставляя настоящую 128-битную учетверенную точность.long double
, который может обеспечивать точность до 80 бит в некоторых системах, обеспечивая совместимость с np.longdouble
.Гибкость архитектуры
numpy_quaddtype
наследуется от компонентов ее ядра: QuadPrecisionObject
, хамелеоноподобная структура, которая может переключаться между формами:typedef union {
Sleef_quad sleef_value;
long double longdouble_value;
} quad_value;
typedef struct {
PyObject_HEAD
quad_value value;
QuadBackendType backend;
} QuadPrecisionObject;
QuadPrecDTypeObject
, который действует как мост, позволяя высокоточным числам гармонично работать в массивах и операциях NumPy:typedef struct {
PyArray_Descr base;
QuadBackendType backend;
} QuadPrecDTypeObject;
Он позволяет переключаться между бекэндами Sleef_quad (для SLEEF) и long double во время выполнения:
>>> import numpy as np
>>> import numpy_quaddtype as npq
# Using SLEEF backend (default)
>>> x = npq.QuadPrecision(3.5)
>>> x = npq.QuadPrecision(3.5, backend='sleef')
>>> repr(x)
QuadPrecision('3.5e+000', backend='sleef')
# Using longdouble backend
>>> y = npq.QuadPrecision(2.5, backend='longdouble')
>>> repr(y)
QuadPrecision('2.5e+000', backend='longdouble')
# Creating a NumPy array with QuadPrecision dtype
>>> z = np.array([x, x], dtype=npq.QuadPrecDType()) # SLEEF
>>> print(z)
[QuadPrecision('3.5e+000', backend='sleef')
QuadPrecision('3.5e+000', backend='sleef')]
>>> z = np.array([y, y], dtype=npq.QuadPrecDType("longdouble")) # longdouble
>>> print(z)
[QuadPrecision('2.5e+000', backend='longdouble')
QuadPrecision('2.5e+000', backend='longdouble')]
В тестах
numpy_quaddtype
с бэкендом SLEEF показал точность в 34 десятичных знаков. ULP (единица в младшем разряде) для основных арифметических операций ≤ 0,5000000001
, а для трансцендентных функций ≤ 1,0. C бэкендом Long Double показал точность, зависящую от платформы: 18-19 десятичных знаков в Linux и 15-17 в Windows.
В настоящее время ведётся подготовка к выпуску
numpy_quaddtype
в виде пакета Python, доступного через PyPI и conda. Также планируется направить предложение NEP для интеграции numpy_quaddtype
в экосистему NumPy и рассмотреть TLFloat
как потенциальную замену SLEEF в будущих версиях.numpy_quaddtype
на примере визуализации множества Мандельброта при экстремальном увеличении и моделирование квантового гармонического осциллятора для двухатомных молекул.@ai_machinelearning_big_data
#AI #ML #DS #Python #NumPy
Please open Telegram to view this post
VIEW IN TELEGRAM
По мере роста объемов данных и сложности вычислений, вычисления на Python и NumPy, основанные на CPU, нуждаются в ускорении для выполнения современных исследований.
cuPyNumeric разработана, чтобы стать заменой библиотеки NumPy, предоставляя сообществу Python распределенные и ускоренные вычисления на платформе NVIDIA. cuPyNumeric позволяет масштабировать вычисления без изменения кода проектов с одного CPU до суперкомпьютеров с несколькими GPU и вычислительными нодами.
Библиотека построена на Legate, поддерживает родной Python и интерфейс NumPy. cuPyNumeric доступен из conda (версия не ниже 24.1) в legate channel. На системах с GPU пакеты, поддерживающие графические ускорители будут выбраны автоматически во время установки.
Пример эффективности cuPyNumeric - обработка 10 ТБ микроизображений многоракурсной микроскопии в виде одного массива NumPy за один день с визуализаций в режиме реального времени.
# Create new conda env
conda create -n myenv -c conda-forge -c legate cupynumeric
# Test via example from repo
$ legate examples/black_scholes.py
Running black scholes on 10K options...
Elapsed Time: 129.017 ms
@ai_machinelearning_big_data
#AI #ML #NumPy #NVIDIA #cuPyNumeric
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM