Здравствуйте, пишу нейросеть для распознавания цифр на cuda. Хочу получить максимум ускорения. На питоне 10 000 тренировок проходят за 20 секунд. На C++ за 10секунд. Вот теперь настал черед cuda. Есть класс neuralNet и в нем 3 функции: конструктор, тренировка и опрос. Как мне параллельно вызвать сразу несколько функций тренировки?Понимаю, что там нужны будут управляющие потоки и блокированная память, но мало с этим работал и не могу собрать все воедино.
Заранее спасибо за ответ)
CUDA это на порядок сложнее, чем запустить функцию в несколько потоков. Здесь совсем другая парадигма программирования, нужно мыслить не функциями, а блоками, тредами и их индексами. Надо разделять где глобальная память, а где память треда. Надо всегда учитывать блочное копирование данных, а не абы как. Не забывать про синхронизацию в варпе, а не искать потом баги.
Написать код по тостеру конечно вероятность имеется, но он явно не будет скоростной как вам хочется. С наскока ничего не выйдет, как минимум нужно прочитать документацию, а как максимум попробовать каждый пример из неё.
С верхним комментарием соглашусь. Попробуйте с легкого, а именно использовать готовые библиотеки cublas, cusparse, thrust, для этого вам необходимо разбить ваш код на последовательность векторных, матричновекторных или матричных операций и использовать библиотечные вызовы. Однако thrust больше возможностей и там можно реализовать некоторые операции чисто под себя для вызова на CUDA. Вообщем не стремитесь сами писать свои KERNEL для CUDA, т.к. много разбираться нужно в начале.