iNc · Вычисления в памяти

Спецификация SSPU.dll

SSPU.dll обеспечивает подключение к устройствам SSPU, приближенные функции активации Sloppy и целочисленную арифметику с насыщением.

1. Обзор

Эта DLL обеспечивает связь с SSPU и операции Sloppy. Каждая операция передает входные данные устройству SSPU, выполняет вычисление с указанными параметрами и получает выходные данные.

Приближенные функции активации

SloppySigmoid, SloppyTanh, SloppySiLU, SloppyGeLU, SloppySoftmax

Целочисленные операции с насыщением

IntAddSat, IntSubSat, IntMulSat

Подключение устройства

Connect

2. Рабочая среда

ПараметрЗначение
Поддерживаемая ОСWindows 64-bit
Поддерживаемая архитектураx64
Целевая платформа.NET 8.0
Требуемые праваПрава администратора
Библиотека-зависимостьSystem.Management.dll
Файлы среды выполненияНет
СоставSSPU.dll (один файл)

3. Подключение

3.1 Предварительные условия

  • Установите .NET 8.0 SDK или более позднюю версию.
  • Запускайте приложение с правами администратора.
  • Разместите SSPU.dll в доступном пути.

3.2 Добавление ссылки

// Add a reference to SSPU.dll
// Option A: Visual Studio: right-click project -> Add Reference -> Browse
// Option B: add this to .csproj:
<Reference Include="SSPU">
  <HintPath>path\to\SSPU.dll</HintPath>
</Reference>

3.3 Шаги интеграции

using SSPU;

// 1. Create an instance
var sspu = new SSPUDevice();

// 2. Connect the device
int result = sspu.Connect();
if (result != 0) {
    Console.WriteLine($"Connection failed: {result}");
    return;
}

// 3. Run an operation (SloppySigmoid example)
byte[] inBuffer = PrepareInputData(...);
byte[] outBuffer = new byte[expectedOutputSize];
result = sspu.SloppySigmoid(inBuffer, outBuffer, param_n, param_b);

// 4. Prefer asynchronous execution
await Task.Run(() => sspu.SloppySigmoid(inBuffer, outBuffer, param_n, param_b));

4. Спецификация API

4.1 Список методов

МетодФункция
ConnectУстановление соединения с устройством SSPU
SloppySigmoidПриближенная функция активации Sigmoid
SloppyTanhПриближенная функция активации Tanh
SloppySiLUПриближенная функция активации SiLU
SloppyGeLUПриближенная функция активации GeLU
SloppySoftmaxПриближенная функция активации Softmax
IntAddSatЗнаковое сложение с насыщением
IntSubSatЗнаковое вычитание с насыщением
IntMulSatЗнаковое умножение с насыщением

4.1.1 Connect

Устанавливает соединение с устройством SSPU. Этот метод необходимо вызвать до любого другого вычислительного метода.

int Connect()

Возвращаемое значение

0 = нормальное завершение (подключение успешно); отрицательное значение = ошибка

  • Вызовите перед использованием любого вычислительного метода.
  • При неудачном подключении последующие вычислительные вызовы возвращают -1.

4.1.2 SloppySigmoid

Выполняет приближенную функцию активации Sigmoid. Входные данные передаются устройству SSPU, затем возвращается результат вычисления.

int SloppySigmoid(byte[] inBuffer, byte[] outBuffer, byte param_n, byte param_b)
ПараметрТипОписание
inBufferbyte[]Массив входных данных (см. 5.3)
outBufferbyte[]Массив выходных данных (см. 5.4)
param_nbyteПараметр N - общая разрядность (3-32)
param_bbyteПараметр B - разрядность дробной части

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Требования к входным и выходным данным приведены в главе 5.
  • Используйте асинхронный вызов: await Task.Run(() => sspu.SloppySigmoid(...)).

4.1.3 SloppyTanh

Выполняет приближенную функцию активации Tanh. Входные данные передаются устройству SSPU, затем возвращается результат вычисления.

int SloppyTanh(byte[] inBuffer, byte[] outBuffer, byte param_n, byte param_b)
ПараметрТипОписание
inBufferbyte[]Массив входных данных
outBufferbyte[]Массив выходных данных
param_nbyteПараметр N - общая разрядность (3-32)
param_bbyteПараметр B - разрядность дробной части

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Используйте асинхронный вызов: await Task.Run(...).

4.1.4 SloppySiLU

Выполняет приближенную функцию активации SiLU. Входные данные передаются устройству SSPU, затем возвращается результат вычисления.

int SloppySiLU(byte[] inBuffer, byte[] outBuffer, byte param_n, byte param_b)
ПараметрТипОписание
inBufferbyte[]Массив входных данных
outBufferbyte[]Массив выходных данных
param_nbyteПараметр N - общая разрядность (3-32)
param_bbyteПараметр B - разрядность дробной части

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Используйте асинхронный вызов: await Task.Run(...).

4.1.5 SloppyGeLU

Выполняет приближенную функцию активации GeLU. Входные данные передаются устройству SSPU, затем возвращается результат вычисления.

int SloppyGeLU(byte[] inBuffer, byte[] outBuffer, byte param_n, byte param_b)
ПараметрТипОписание
inBufferbyte[]Массив входных данных
outBufferbyte[]Массив выходных данных
param_nbyteПараметр N - общая разрядность (3-32)
param_bbyteПараметр B - разрядность дробной части

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Используйте асинхронный вызов: await Task.Run(...).

4.1.6 SloppySoftmax

Выполняет приближенную функцию активации Softmax. Одна группа содержит 2^d элементов.

int SloppySoftmax(byte[] inBuffer, byte[] outBuffer, byte param_n, byte param_b, byte param_d, byte param_mode = 0)
ПараметрТипОписание
inBufferbyte[]Массив входных данных
outBufferbyte[]Массив выходных данных
param_nbyteПараметр N - общая разрядность
param_bbyteПараметр B - разрядность дробной части
param_dbyteПараметр D - показатель числа элементов в группе (одна группа = 2^d элементов)
param_modebyteВыбор режима (по умолчанию 0; см. таблицу ниже)

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Одна операция обрабатывает 2^d элементов как одну группу.
  • Ограничение одного вызова: число групп <= 15872 / 2^d.
  • Число входных элементов должно быть кратно 2^d (полные группы).
  • Это приближенная операция; результат может отклоняться примерно на +/-1 младший разряд.
  • Используйте асинхронный вызов: await Task.Run(...).
РежимТипДопустимый диапазон параметров
0 (по умолчанию)Упрощенный3 <= n <= 32, b >= 0, 2 <= d <= 13, 2 <= n-b <= d+1
1Стандартный7 <= n <= 32, b >= 4, d >= 1, 3 <= n-b <= d+2
2+ЗарезервированоЗарезервировано; не используется

4.1.7 IntAddSat

Выполняет знаковое сложение с насыщением. При выходе результата за диапазон типа возвращается максимальное или минимальное значение этого типа.

int IntAddSat(byte[] aBuffer, byte[] bBuffer, byte[] outBuffer, byte param_n)
ПараметрТипОписание
aBufferbyte[]Входной массив A (операнд A)
bBufferbyte[]Входной массив B (операнд B)
outBufferbyte[]Выходной массив (A + B)
param_nbyteПараметр N - общая разрядность (2-32)

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Вход и выход являются знаковыми целыми; разрядность задает param_n.
  • Используйте асинхронный вызов: await Task.Run(...).

4.1.8 IntSubSat

Выполняет знаковое вычитание с насыщением. При выходе результата за диапазон типа возвращается максимальное или минимальное значение этого типа.

int IntSubSat(byte[] aBuffer, byte[] bBuffer, byte[] outBuffer, byte param_n)
ПараметрТипОписание
aBufferbyte[]Входной массив A (уменьшаемое)
bBufferbyte[]Входной массив B (вычитаемое)
outBufferbyte[]Выходной массив (A - B)
param_nbyteПараметр N - общая разрядность (2-32)

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • Используйте асинхронный вызов: await Task.Run(...).

4.1.9 IntMulSat

Выполняет знаковое умножение с насыщением. Поддерживается выходная разрядность k; при k = 2n полный продукт сохраняется без насыщения.

int IntMulSat(byte[] aBuffer, byte[] bBuffer, byte[] outBuffer, byte param_n, byte param_k)
ПараметрТипОписание
aBufferbyte[]Входной массив A (операнд A)
bBufferbyte[]Входной массив B (операнд B)
outBufferbyte[]Выходной массив (A x B)
param_nbyteПараметр N - разрядность каждого операнда (2-16)
param_kbyteПараметр K - выходная разрядность (n-2n; без насыщения при k = 2n)

Возвращаемое значение

0 = нормальное завершение; отрицательное значение = ошибка (см. 4.2)

  • A и B - знаковые n-битные целые.
  • При k = 2n полный продукт сохраняется без отсечения насыщением.
  • Используйте асинхронный вызов: await Task.Run(...).

4.2 Ошибки

Код ошибкиОписание
0Нормальное завершение
-1Нет подключения (дескриптор устройства не получен; Connect не вызывался или завершился ошибкой)
-2Не удалось получить свободный BankID (ошибка обработки или свободный Bank не найден)
-3Не удалось отправить команду SetDataDMA
-4Не удалось отправить команду StartCalculation
-5Не удалось отправить GetBankStatus (ошибка отправки или истекло время опроса статуса)
-6Не удалось отправить команду GetDataDMA
-10Ошибка передачи списка команд
-11Ошибка создания списка команд
-12Входные данные превышают лимит одного вызова или число элементов SloppySoftmax не кратно 2^d

5. Спецификация входных и выходных данных

5.1 Термины

ТерминОписание
nРазрядность одного входного значения (например, 22 бита)
bРазрядность дробной части
dТолько для SloppySoftmax: показатель числа элементов в группе (одна группа = 2^d элементов)
kТолько для IntMulSat: выходная разрядность (n-2n)
I(s, m, b)Формат с фиксированной точкой: s = число знаковых битов, m = целая часть, b = дробная часть, общая ширина = s + m + b
bytesPerDataБайт на элемент: вход = (n+7)/8; выход вычисляется по выходной разрядности
elementCountЧисло элементов = inBuffer.length / ((n+7)/8)
LSB firstХраните биты последовательно, начиная с bit0 (младший бит)

5.2 Типы входа и выхода

МетодТип входаТип выходаВыходная разрядностьТип результата
SloppySigmoidI(1, n-1-b, b)I(0, 0, b+2)b + 2Беззнаковый (0-1)
SloppyTanhI(1, n-1-b, b)I(1, 0, b)b + 1Знаковый (-1 до +1)
SloppySiLUI(1, n-1-b, b)I(1, n-1-b, b)nЗнаковый
SloppyGeLUI(1, n-1-b, b)I(1, n-1-b, b)nЗнаковый
SloppySoftmaxI(1, n-1-b, b)I(0, 0, n)nБеззнаковый (0-1)
IntAddSatI(1, n-1, 0)I(1, n-1, 0)nЗнаковый
IntSubSatI(1, n-1, 0)I(1, n-1, 0)nЗнаковый
IntMulSatI(1, n-1, 0)I(1, k-1, 0)kЗнаковый

5.3 Входные данные

Процесс подготовки входных данных

  1. Маскируйте значение до n бит (например, используйте только младшие 22 бита).
  2. Выполните знаковое расширение: если старший бит равен 1, считайте значение отрицательным и заполните старшие биты единицами.
  3. Упакуйте биты, начиная с младшего (LSB first).
  4. Храните каждый элемент в (n + 7) / 8 байтах; неиспользуемые биты последнего байта не применяются.

Пример расположения битов (n = 22 -> 3 байта/элемент)

БайтСодержимое битов
Byte0bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Byte1bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8
Byte2[unused] [unused] bit21 bit20 bit19 bit18 bit17 bit16

Пример входа: {45, -73} (n = 22)

// Byte sequence for {45, -73} (n = 22, 3 bytes/data):
// 45  -> 0x00002D -> Byte0: 0x2D, Byte1: 0x00, Byte2: 0x00
// -73 -> 0x3FFFB7 -> Byte0: 0xB7, Byte1: 0xFF, Byte2: 0x3F
//
// Final inBuffer: 2D 00 00 B7 FF 3F

Примечания по входу/выходу SloppySoftmax

  • Вход состоит из последовательных групп Softmax; каждая группа содержит 2^d последовательных элементов.
  • Выход возвращается в том же порядке групп.
  • Число входных элементов должно быть кратно 2^d (полные группы).
  • Это приближенная операция; результат может отклоняться примерно на +/-1 младший разряд.

5.4 Выходные данные

Процесс восстановления выходных данных

  1. Восстановите биты выходной разрядности в порядке LSB first.
  2. Интерпретируйте знак в соответствии с выходным типом.
  3. Знаковые (Tanh / SiLU / GeLU): используйте старший бит как знаковый и выполните знаковое расширение.
  4. Беззнаковые (Sigmoid / Softmax): не выполняйте знаковое расширение (дробь с фиксированной точкой не меньше 0).

Выделение буфера

МетодВыходная разрядностьБайт на элемент
SloppySigmoidb + 2(b + 2 + 7) / 8
SloppyTanhb + 1(b + 1 + 7) / 8
SloppySiLU / GeLU / Softmaxn(n + 7) / 8
IntAddSat / IntSubSatn(n + 7) / 8
IntMulSatk(k + 7) / 8

5.5 Ограничение емкости

Один вычислительный вызов обрабатывает не более одной страницы устройства: эффективная область содержит 15872 элемента. Вызовы сверх лимита должен разбивать вызывающий код.

Категория функцийЛимит одного вызоваПримечание
Sigmoid / Tanh / SiLU / GeLU / IntAddSat / IntSubSat / IntMulSatelementCount <= 15872В единицах элементов
SloppySoftmaxЧисло групп <= 15872 / 2^dЧисло входных элементов должно быть кратно 2^d

Примеры максимального числа групп SloppySoftmax

dЛимит одного вызова
23968 групп
931 группа
131 группа
14+Не поддерживается

Важно: При превышении лимита возвращается код ошибки -12. SloppySoftmax также возвращает -12, если число входных элементов не кратно 2^d.