Мне нужно предварительно выполнить несколько сверток с малыми матрицами и ядрами, и я надеялся, что использование многих процессоров GPU позволит мне как можно быстрее.Наилучший подход для свертки множества малых матриц с использованием CUDA
Проблема заключается в следующем: у меня много матриц (от 1000 до 10000) или относительно небольших размеров (~ 15x15 до 1x1 - как в скалярном) и определенное количество сверточных масок (от 20 до 1) , Мне нужна свертка всех матриц с каждой сверткой маской примера:
A; %5,000 matrices of size 10x10, A(i) = a 10x10 matrix
B; 10 matrices of size 5x5, B(k) = a 5x5 matrix
res(j)=conv(A,B(1)); %res(j) is the result of convolving all 5,000
%matrices in A by the j'th kernel B(j)
целью является вычислительным Рез (1), ..., Рез (10) как можно быстрее
Я хотел бы услышать предложения о том, как реализовать наиболее эффективный алгоритм. Свертка на основе FFT, вероятно, будет слишком медленной.
Каждая реализация, которую я видел до сих пор, предназначена для 2-й свертки, предназначенной для свертки двух больших матриц, в то время как мне нужно свертывать множество маленьких матриц.
Я знаю очень мало о программировании CUDA прямо сейчас, но я в процессе обучения.
Я надеялся выяснить это сам, но из-за ограничений во времени я вынужден просить совета, который может дать мне любой опыт, в то время как я узнаю, как кодировать в CUDA.
Спасибо!
p.s. любые указатели на реализацию, которая соответствует моим целям, более чем ценятся. Я ученик университета, и это для небольшого исследовательского проекта, поэтому ничего не нужно платить за ...
Эта проблема не идеальна для графического процессора из-за небольшого размера матриц. Из опыта внедрения пакетных решателей для небольших матриц на GPU я бы рекомендовал использовать один блок потока для каждой матрицы для больших матриц и один поток на матрицу для действительно маленьких матриц. Вам нужно было бы найти точку переключения между двумя подходами экспериментально, это, вероятно, между размером 7 и размером 10. – njuffa
Спасибо. Я думал, что почти никто не нуждается в этом, но я рад видеть, что, по крайней мере, кто-то осуществил это. Вы случайно не знаете, где я могу найти очень быструю реализацию CUDA для такой проблемы? Я смотрел и ничего не мог найти, но если там будет очень хорошая реализация, было бы здорово. Я не ожидаю, что мой код будет таким же быстрым, как у более опытных программистов CUDA (и сейчас я почти не знаю этой темы, поэтому кто-то был бы более опытным, чем я ...) – user1999728
Решёвый решатель и обратный код матрицы доступен для загрузки с зарегистрированного сайта разработчика NVIDIA. Я не знаю, какой код свертки, который я знаю, я просто выделил возможное разбиение на основе сходства по размеру и количеству матриц. Поскольку работа над сверткой находится в контексте небольшого студенческого исследовательского проекта, кажется, что это хороший шанс получить опыт, реализуя эту функциональность самостоятельно. – njuffa