2015-10-28 4 views
0

Я реализовал программу на GPU (CUDA), которая использует только хост (на C++) для запуска новых ядер. Во время расчета на устройстве мне нужны SVD и решающие системы 3х3 (плотных) матриц фиксированного размера.Размер SVD и решатель в CUDA (в устройстве)

У меня есть собственная реализация SVD и решателя, но она не является численной стабильностью (поэтому не используется). Из-за того, что я был довольно новым с C++ и CUDA, я предпочел бы вместо этого использовать библиотеку. (Числовой материал очень сложно)

Теперь у меня есть проблемы с поиском, что библиотека:

  • cuSOLVER не является вызываемым из устройства
  • CU не вызываемая формы устройства (и заброшен так кажется)
  • Eigen выглядит многообещающим (должен быть вызван с устройства?), Но неясно, какой статус поддерживается CUDA (это говорит экспериментальный). Я нахожу, что люди говорят, что это работает, другие получили ошибки компиляции?

Желательно, чтобы я мог выполнять операции общей матрицы с библиотекой (транспонирование, инверсия, сумма, умножение, ...), так как мои собственные реализации, вероятно, будут менее эффективными и численно устойчивыми для них.

Любые идеи о том, как достичь этого?

UPDATE: Похоже Эйгеном поддерживает основные функции, такие как *, +, переставлять и даже собственные, но СВД, обратная ЭСТ пока не поддерживается. Это на момент написания.

+3

Для матрицы 3x3, почему бы вам не разработать аналитическое решение? – JackOLantern

+2

Исходный код (лицензия BSD) для пакетного решателя для небольших матриц фиксированного размера доступен в виде бесплатной загрузки с зарегистрированного веб-сайта разработчика CUDA. Он должен быть простым в использовании или адаптации для ваших целей. – njuffa

ответ

2

В соответствии с website подмножество функций работает для матриц фиксированного размера (3x3 в вашем случае) от Eigen 3.3. Текущий стабильный релиз составляет 3,6,6, а 3,3 - в альфа. Я не знаю, поддерживается ли поддержка SVD в CUDA. Я бы порекомендовал попробовать небольшой MCVE, чтобы узнать, работает ли он (а также другие функции, которые вам нужны), и если да, то внедряйте его в свой проект.

+0

К сожалению, оказалось, что подмножество полезной функции в CUDA очень мало: транспонирование, SVD, решение системы, обратное, ..., похоже, не поддерживается на «__device__» на момент написания. В результате «вызов функции __host__ из функции __host__ __device__ недопустим» ошибки – iami

+0

@iami Вы уверены, что используете версию 3.3, а не 3.2.6? Я не знаю, что это работает, просто пытается помочь выяснить. –

+0

Да, я даже пробовал текущую главную ветвь. Это все еще может быть что-то на моем конце (первый раз с использованием Eigen). Будут делать некоторые дополнительные испытания, чтобы быть уверенным. – iami

0

У меня такая же проблема; хотят генерировать случайные векторы внутри функции ядра, что требует выполнения холеских/собственных значений разложений NxN (N < = 5) ковариационных матриц. Поскольку, как вы отметили, библиотеки MAGMA и CULA недоступны с устройства, и, как представляется, no cuSOLVER device API yet, я прибегнул к их реализации следующими алгоритмами, описанными, например, в Numerical Recipes in C. Что касается решения линейных систем, я бы предложил проверить cuBLAS (функции уровня 2), так как он предоставляет некоторые базовые функции. Если вы хотите инвертировать матрицы, я бы предложил cublasmatinvBatched(). Я не использовал его сам, попробую в выходные, но из описания это кажется многообещающим. Надежда другие будут перебирать эту тему с лучшими решениями ...

+0

В настоящее время я работаю над MCVE с Eigen, как предложил Ави Гинзбург. Пока это похоже на компиляцию и работу, но я еще ничего не реализовал. Хотя на GPU не все поддерживается (пока?), Вы можете захотеть сделать MCVE и посмотреть, сможете ли вы это сделать. – iami

+0

В 3.3 сводке изменений говорится, что «поддерживается только подмножество функций», но не нашел дополнительной информации. Вы нашли какую-либо конкретную документацию или вы просто проходите через источник? – phil1710

+0

Я не нашел ничего более конкретного, чем «поддерживается только подмножество функций», поэтому я просматриваю источник, но без особого прогресса, если честно (довольно новичок в C++). – iami