sách gpt4 ai đã đi

Nghịch đảo Cholesky tại chỗ

In lại 作者:行者123 更新时间:2023-11-28 06:59:03 28 4
mua khóa gpt4 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 分解中获得的行列式,我认为计算倒数会更好。

1 Câu trả lời

我不确定我要说的是否对您有帮助。但是在 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 上进行人脸检测的论文,以阅读有关内存访问模式的更多信息。

../../../media/1Iss8-IJCES0402603_v4_iss2_47-55.pdf

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

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

28 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com