2015-04-05 2 views
5

Я ищу работу около 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 секунды.

+0

У меня такая же проблема: собственный анализ для многих небольших матриц 3x3. Было бы неплохо увидеть какое-то решение gpu. Хороший пост. –

ответ

3

Функции cublas getrfBatched и getriBatched предназначены для пакетной инверсии небольших матриц. Это должно быть быстрее, чем динамический параллелизм или потоки (ваши 2-й и 3-й подходы.) Также доступен пакетный решатель в source code form, который может выполнять инверсии матрицы. Чтобы получить доступ к этой ссылке, вам нужно будет войти в систему как зарегистрированный разработчик на developer.nvidia.com.

Кроме того, я не уверен, что есть что-то подобное cuBLAS, которое также может выполнять eigendecomposition или SVD. (Насколько я знаю, CULA не поддерживает вызов своих подпрограмм из ядер).

Cusolver предоставляет некоторые eigen solver functions.Тем не менее, они не упакованы и не могут быть вызваны из кода устройства, поэтому вы столкнулись с потоками как единственный вариант, кроме этого.

Смежные вопросы