Я ищу работу около 4000 матриц фиксированного размера (3x3, 4x4), делая такие вещи, как инверсия матрицы и eigendecomposition.Работа со многими матрицами фиксированного размера в ядрах CUDA
Мне кажется, что лучший способ распараллеливать это - позволить каждому из многих потоков GPU работать с одним экземпляром проблемы.
Есть ли разумный способ сделать это? Я читал: http://www.culatools.com/blog/2011/12/09/batched-operations/, но насколько я могу судить, это всегда то, над чем «работает», без решения. Три года спустя я надеюсь, что есть хорошее решение.
До сих пор, я посмотрел на:
- Использование Эйгена в CUDA ядер: http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html. Но это находится в зачаточном состоянии: таким образом, это не работает хорошо, и некоторые вещи не реализованы. Более того, я не уверен, что он оптимизирован для CUDA. Документальной документации почти нет, и единственным примером кода является тестовый файл (собственный/test/cuda_basic.cu). Когда я попытался использовать Eigen в ядрах CUDA, простые вещи, такие как объявление
Eigen::MatrixXf
в ядре, не сохранились в компиляции сnvcc V7.0.27
и Eigen 3.2.90 (mercurial). - Использование библиотеки API устройства cuBLAS для запуска подпрограмм BLAS в ядре. Кажется, что cuBLAS и его ilk написаны для распараллеливания даже для небольших матриц, которые кажутся чрезмерными и, вероятно, медленными для матриц 3x3 и 4x4, которые меня интересуют. Кроме того, я не уверен, что есть что-то вроде cuBLAS, которые также могут делать eigendecomposition или SVD. (Насколько я знаю, CULA не поддерживает вызов своих подпрограмм из ядер).
- Ячейки пакетной обработки с использованием потоков CUDA. В разделе 2.1.7 «Ячейки дозирования» документации cuBLAS для CUDA Toolkit v7.0 предлагается. Но "" на практике невозможно одновременное выполнение более чем 16 одновременных ядер "" ", и, следовательно, было бы ужасно для обработки 4000 маленьких матриц. В вышеупомянутой ссылке на сообщение в блоге CULA я цитирую: «« Теоретически можно использовать поток CUDA для каждой проблемы и одновременно запускать одну проблему. Это будет плохо работать по двум причинам: во-первых, количество потоков на блок было бы слишком низким; [...] Во-вторых, накладные расходы, вызванные запуском тысяч операций таким образом, были бы неприемлемыми, поскольку код запуска был столь же дорогим (если не более дорогим), как просто выполнение матрица на ЦП. "" "
- Реализация моего собственного умножения матрицы и eigendecomposition в ядрах. Это, вероятно, будет очень медленным и может потребовать много времени для реализации.
На данный момент у меня возникает соблазн отказаться от этого на графическом процессоре. Жаль, так как я надеялся на производительность в реальном времени для алгоритма, который требует инвертирования 4000 3x3 матриц примерно 100 раз каждые 0,1 секунды.
У меня такая же проблема: собственный анализ для многих небольших матриц 3x3. Было бы неплохо увидеть какое-то решение gpu. Хороший пост. –