Как заморозить холески инверсию (потри)? - PullRequest
0 голосов
/ 08 июля 2019

Cusolver имеет разложение Холецкого, в отличие от CUBLAS.Я вижу cusolverDnDpotrsBatched и cusolverDnDpotrfBatched, но, к сожалению, я не могу найти cusolverDnDpotriBatched в документации .

Есть ли какой-нибудь способ, которым я могу пакетировать cusolverDnDpotri без больших накладных расходов, или способ сделать эквивалент того, что сделал бы API?

1 Ответ

1 голос
/ 08 июля 2019

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

Вы уверены, что вам действительно нужно обратное? Операции с обратным обычно могут быть выражены как решение линейной системы, для которой вы могли бы использовать cusolverDnPotrsBatched.

Если вам действительно нужно обратное, единственный способ, который я могу придумать без необходимости написания кода CUDA, - это вызвать cusolverDnPotrsBatched с правыми сторонами Barray, установленными в пакет идентичных матриц. Таким образом, решения Xi систем Ai * Xi = I (которые перезаписывают Barray) являются инверсиями матрицы матрицы Aarray. Он требует дополнительной памяти и не так эффективен, как запись ядра для инверсии, но должен быть быстрее, чем делать это последовательно.

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

...