Repository navigation
Releases
3.2.3
Я внедрил функцию mad_256_by_64 и обновил MulModP. Теперь вместо того, чтобы вычислять промежуточные произведения в tmp и затем складывать их с буфером (что требует отдельных циклов чтения/записи и лишних регистров), код выполняет операцию "умножить-сложить" (MAD) за один проход.
Ожидаемый эффект:
Снижение количества инструкций: Убраны лишние инструкции сложения и перемещения данных.
Снижение давления на регистры: Массив tmp больше не нужен для промежуточных произведений, что освобождает драгоценные регистры для других задач.
Прирост скорости: Особенно заметен на картах RTX 40xx, где ALU очень мощные, и узким местом часто является именно работа с регистрами и диспетчеризация инструкций.
3.2.2
- Увеличил параметр STEP_CNT с 1000 до 2000.
- Оптимизация для 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
Прирост скорости ~8%
Что было сделано:
Анализ узкого места: Выявлено, что функция SqrModP (возведение в квадрат по модулю) создавала чрезмерную нагрузку на регистровый файл GPU, вычисляя большой массив mar[28] (224 байта) целиком перед использованием. Это приводило к вытеснению данных в медленную память.
Оптимизация SqrModP:
Реализовано "чередование" (Interleaving) вычислений: элементы массива mar теперь вычисляются небольшими группами непосредственно перед их использованием в функциях сложения. Это позволяет освобождать регистры сразу после использования данных.
Устранен указатель m32, который мог мешать компилятору эффективно размещать переменные массива mar в регистрах.
Проверка корректности: Математическая логика функции не изменена — изменен только порядок выполнения независимых операций умножения. Это гарантирует, что итоговый результат вычислений останется прежним, но скорость работы GPU-ядра увеличится за счет уменьшения задержек памяти.