Skip to content

Releases

3.2.3

Choose a tag to compare

@Slait Slait released this 26 Nov 05:55
07701e7

Я внедрил функцию mad_256_by_64 и обновил MulModP. Теперь вместо того, чтобы вычислять промежуточные произведения в tmp и затем складывать их с буфером (что требует отдельных циклов чтения/записи и лишних регистров), код выполняет операцию "умножить-сложить" (MAD) за один проход.

Ожидаемый эффект:

Снижение количества инструкций: Убраны лишние инструкции сложения и перемещения данных.
Снижение давления на регистры: Массив tmp больше не нужен для промежуточных произведений, что освобождает драгоценные регистры для других задач.
Прирост скорости: Особенно заметен на картах RTX 40xx, где ALU очень мощные, и узким местом часто является именно работа с регистрами и диспетчеризация инструкций.

3.2.2

Choose a tag to compare

@Slait Slait released this 26 Nov 05:06
b54367c
  1. Увеличил параметр STEP_CNT с 1000 до 2000.
  2. Оптимизация для Nvidia 40xx и 50xx.
    2.1. Увеличение размера группы (PNT_GROUP)
    В алгоритме используется "Simultaneous Inversion" (одновременная инверсия) для группы точек. Это самая тяжелая математическая операция. Чем больше группа, тем "дешевле" обходится инверсия в пересчете на одну точку (одна тяжелая операция делит стоимость на N точек). Ранее мы использовали размер 24, чтобы данные влезали в маленький L2 кэш старых карт. Для RTX 40xx/50xx мы можем безопасно увеличить это число до 32 (размер варпа). Это даст прирост скорости, так как мы будем делать меньше инверсий на то же количество точек, а данные легко поместятся в L2 кэш Ada Lovelace.
    2.2. Адаптивное управление L2 кэшем
    В коде было ограничение на размер персистентного кэша. На новых картах мы можем запрашивать у драйвера максимально возможный размер L2 (так как он теперь огромный) и использовать его по максимуму, чтобы вообще не обращаться к видеопамяти (VRAM) в процессе вычислений.
    Я обновил GpuKang.cpp для динамического определения лимита L2.

3.2.1

Choose a tag to compare

@Slait Slait released this 25 Nov 17:58
f24cd05

Прирост скорости ~8%
Что было сделано:

Анализ узкого места: Выявлено, что функция SqrModP (возведение в квадрат по модулю) создавала чрезмерную нагрузку на регистровый файл GPU, вычисляя большой массив mar[28] (224 байта) целиком перед использованием. Это приводило к вытеснению данных в медленную память.

Оптимизация SqrModP:
Реализовано "чередование" (Interleaving) вычислений: элементы массива mar теперь вычисляются небольшими группами непосредственно перед их использованием в функциях сложения. Это позволяет освобождать регистры сразу после использования данных.
Устранен указатель m32, который мог мешать компилятору эффективно размещать переменные массива mar в регистрах.

Проверка корректности: Математическая логика функции не изменена — изменен только порядок выполнения независимых операций умножения. Это гарантирует, что итоговый результат вычислений останется прежним, но скорость работы GPU-ядра увеличится за счет уменьшения задержек памяти.

3.2

3.2

Choose a tag to compare

@Slait Slait released this 25 Nov 16:31
96cf58c

Tested Windows 11. Nvidia 4060