Рассчитать собственные значения/собственные векторы сотен малых матриц с использованием CUDA
У меня вопрос о собственном разложении сотен небольших матриц с использованием CUDA.
Мне нужно вычислить собственные значения и собственные векторы из сотен (например, 500) малых (64 на 64) реальных симметричных матриц одновременно. Я попытался реализовать его методом Якоби, используя порядок шахматного турнира (см. этот документ (PDF) для получения дополнительной информации).
В этом алгоритме в каждом блоке определены 32 потока, в то время как каждый блок обрабатывает одну небольшую матрицу, а 32 потока работают вместе, чтобы раздуть 32 недиагональных элемента до сходимости. Однако я не очень доволен своей работой.
Мне интересно, где есть лучший алгоритм для моего вопроса, т.е. собственное разложение многих 64-на-64 реальных симметричных матриц. Я думаю, что метод домовладельца может быть лучшим выбором, но не уверен, что он может быть эффективно реализован в CUDA. В Интернете не так много полезной информации, так как большинство других программистов больше заинтересованы в использовании CUDA/OpenCL для разложения одной большой матрицы вместо множества небольших матриц.
Ответы
Ответ 1
По крайней мере, для собственных значений образец можно найти в SDK Cuda
http://www.nvidia.de/content/cudazone/cuda_sdk/Linear_Algebra.html
Изображения кажутся разбитыми, но загрузка образцов по-прежнему работает. Я бы предложил загрузить полный SDK и посмотреть на этот пример. Кроме того, этот документ может быть полезен:
http://docs.nvidia.com/cuda/samples/6_Advanced/eigenvalues/doc/eigenvalues.pdf