gpt4 book ai didi

c++ - 就地 Cholesky 逆

转载 作者:行者123 更新时间:2023-11-28 06:59:03 26 4
gpt4 key购买 nike

我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩阵,而无需重复使用与原始矩阵相同维度的临时矩阵。即求解系统

A x_i = e_i, where e_i is the i-th column if the identity matrix.

我实际上遵循了 http://arxiv.org/abs/1111.4144 中描述的稍微好一点的方法

一些上下文:

我正在编写一个 (C/C++) CUDA 程序,其中每个线程计算一个相对较小(20x20,在某些情况下为 40x40)协方差矩阵的逆矩阵和行列式,以及其他任务。在 CUDA 中使用数组不是很快,这就是为什么我想尽量减少它们的使用。当我编写就地 cholesky 分解代码并限制仅使用矩阵的较低条目时,我已经看到了一些重大改进,这就是为什么如果我设法摆脱方程求解中的临时数组,我希望会有一些改进部分,即如果算法使用临时变量作为至少更小的数组就可以了。

我知道计算 x = A^{-1} b, 这正是我最后所做的,通过求解系统 A x = b 更有效 比计算逆。但由于我还需要在 Cholesky 分解中获得的行列式,我认为计算倒数会更好。

最佳答案

我不确定我要说的是否对您有帮助。但是在 CUDA 中访问数组的成本可能是 16 倍,也可能仅为 1 倍。这取决于每个线程的内存安排和访问模式。

对我来说,假设我有 100 个线程,每个线程需要一个大小为 20x20 整数/ float 的矩阵。如果我是,你会毫不犹豫地只使用一个在所有线程之间共享的数组,并且每个线程都会像这样访问第一个元素:

int iFirstElement = gArray[tid]; // where tid is the thread idx assuming this 1D,2D, or 3D I am sure you can calculate the tid easily.
//to access the second element you can use this:
int iSecondElement = gArray[numOfThreads * 1 + tid];
// to access the third element you can use this
int iSecondElement = gArray[numOfThreads * 2 + tid];

这样您将增强内存访问模式并且只消耗 1X 来访问内存而不是 16x。您可能认为全局内存是个坏主意,但请相信我,事实并非如此。您可以返回我发表的关于在 GPU 上进行人脸检测的论文,以阅读有关内存访问模式的更多信息。

http://ijces.org/media/1Iss8-IJCES0402603_v4_iss2_47-55.pdf

最后,大量使用局部变量会导致调度程序在多个周期内运行该 block ,因为每个 block 的寄存器文件不足以同时运行整个 block 。

关于c++ - 就地 Cholesky 逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22769237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com