Занимаюсь GPU-вычислениями: беру задачи, которые упираются в процессор, и раскладываю их по тысячам параллельных потоков видеокарты, чтобы считались в разы быстрее. Если рендер, физическая симуляция или обучение модели тянутся часами, я сначала измеряю, на чём именно уходит время, потом переделываю самый нагруженный участок и переписываю его как CUDA-ядра, которые держат мультипроцессоры видеокарты в постоянной работе. Для меня важна не только правильность результата, но и то, какую долю реальной пропускной способности удаётся выжать: как организованы обращения к глобальной, разделяемой и регистровой памяти, как ведут себя варпы и где теряются такты.
Чаще всего работа начинается с готового кода на процессоре, которому стало тесно во времени выполнения. Такую логику я переношу на видеокарту постепенно, на каждом шаге сверяя ответы с исходной версией, чтобы результат не разошёлся, а дальше добиваюсь высокой занятости, аккуратного объединённого доступа к памяти и перекрытия потоков, пока прирост скорости не станет ощутимым и подтверждённым цифрами. Уверенно пользуюсь набором CUDA Toolkit и библиотеками cuBLAS, cuFFT, Thrust, а узкие места ищу не наугад, а через Nsight и профилировщики. Отдаю ядра с понятной документацией, воспроизводимым результатом и в виде, готовом лечь в вашу сборку — для научных расчётов, обработки сигналов или машинного обучения.
Если программа тормозит и всё упирается в процессор, расскажите, что за нагрузка и где болит, — честно оценю, сколько выиграет видеокарта и каким путём я к этому приду.
— Написание и оптимизация ядер CUDA
— Перенос вычислений с процессора на видеокарту
— Работа с памятью и пропускной способностью (глобальная, разделяемая, регистры)
— Подключение cuBLAS, cuFFT, Thrust
— Поиск узких мест через Nsight
— Несколько видеокарт и параллельные потоки
— Ускорение HPC и обучения/инференса моделей
Чаще всего работа начинается с готового кода на процессоре, которому стало тесно во времени выполнения. Такую логику я переношу на видеокарту постепенно, на каждом шаге сверяя ответы с исходной версией, чтобы результат не разошёлся, а дальше добиваюсь высокой занятости, аккуратного объединённого доступа к памяти и перекрытия потоков, пока прирост скорости не станет ощутимым и подтверждённым цифрами. Уверенно пользуюсь набором CUDA Toolkit и библиотеками cuBLAS, cuFFT, Thrust, а узкие места ищу не наугад, а через Nsight и профилировщики. Отдаю ядра с понятной документацией, воспроизводимым результатом и в виде, готовом лечь в вашу сборку — для научных расчётов, обработки сигналов или машинного обучения.
Если программа тормозит и всё упирается в процессор, расскажите, что за нагрузка и где болит, — честно оценю, сколько выиграет видеокарта и каким путём я к этому приду.
— Написание и оптимизация ядер CUDA
— Перенос вычислений с процессора на видеокарту
— Работа с памятью и пропускной способностью (глобальная, разделяемая, регистры)
— Подключение cuBLAS, cuFFT, Thrust
— Поиск узких мест через Nsight
— Несколько видеокарт и параллельные потоки
— Ускорение HPC и обучения/инференса моделей