- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 cuSOLVER 库实现 Cholesky 分解。我是一个初学者 CUDA 程序员,我一直指定 block 大小和网格大小,但我无法找出程序员如何使用 cuSOLVER 函数显式设置。
这里是文档:http://docs.nvidia.com/cuda/cusolver/index.html#introduction
QR 分解是使用 cuSOLVER 库实现的(参见此处的示例:http://docs.nvidia.com/cuda/cusolver/index.html#ormqr-example1),即使在那里也没有设置上述两个参数。
总结一下,我有以下几个问题
最佳答案
Robert Crovella 已经回答了这个问题。在这里,我只是提供一个完整的示例,展示如何使用 cuSOLVER 库提供的 potrf
函数轻松执行 Cholesky 分解。
Utilities.cu
和 Utilities.cuh
文件保存在 this page并在此省略。该示例实现了 CPU 和 GPU 方法。
#include "cuda_runtime.h"
#include "device_launch_paraMeters.h"
#include<iostream>
#include <fstream>
#include<iomanip>
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include <cusolverDn.h>
#include <cublas_v2.h>
#include <cuda_runtime_api.h>
#include "Utilities.cuh"
#define prec_save 10
/******************************************/
/* SET HERMITIAN POSITIVE DEFINITE MATRIX */
/******************************************/
// --- Credit to: https://math.stackexchange.com/questions/357980/how-to-generate-random-symmetric-positive-definite-matrices-using-matlab
void setPDMatrix(double * __restrict h_A, const int N) {
// --- Initialize random seed
srand(time(NULL));
double *h_A_temp = (double *)malloc(N * N * sizeof(double));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
h_A_temp[i * N + j] = (float)rand() / (float)RAND_MAX;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
h_A[i * N + j] = 0.5 * (h_A_temp[i * N + j] + h_A_temp[j * N + i]);
for (int i = 0; i < N; i++) h_A[i * N + i] = h_A[i * N + i] + N;
}
/************************************/
/* SAVE REAL ARRAY FROM CPU TO FILE */
/************************************/
template <class T>
void saveCPUrealtxt(const T * h_in, const char *filename, const int M) {
std::ofstream outfile;
outfile.open(filename);
for (int i = 0; i < M; i++) outfile << std::setprecision(prec_save) << h_in[i] << "\n";
outfile.close();
}
/************************************/
/* SAVE REAL ARRAY FROM GPU TO FILE */
/************************************/
template <class T>
void saveGPUrealtxt(const T * d_in, const char *filename, const int M) {
T *h_in = (T *)malloc(M * sizeof(T));
gpuErrchk(cudaMemcpy(h_in, d_in, M * sizeof(T), cudaMemcpyDeviceToHost));
std::ofstream outfile;
outfile.open(filename);
for (int i = 0; i < M; i++) outfile << std::setprecision(prec_save) << h_in[i] << "\n";
outfile.close();
}
/********/
/* MAIN */
/********/
int main(){
const int N = 1000;
// --- CUDA solver initialization
cusolverDnHandle_t solver_handle;
cusolveSafeCall(cusolverDnCreate(&solver_handle));
// --- CUBLAS initialization
cublasHandle_t cublas_handle;
cublasSafeCall(cublasCreate(&cublas_handle));
/***********************/
/* SETTING THE PROBLEM */
/***********************/
// --- Setting the host, N x N matrix
double *h_A = (double *)malloc(N * N * sizeof(double));
setPDMatrix(h_A, N);
// --- Allocate device space for the input matrix
double *d_A; gpuErrchk(cudaMalloc(&d_A, N * N * sizeof(double)));
// --- Move the relevant matrix from host to device
gpuErrchk(cudaMemcpy(d_A, h_A, N * N * sizeof(double), cudaMemcpyHostToDevice));
/****************************************/
/* COMPUTING THE CHOLESKY DECOMPOSITION */
/****************************************/
// --- cuSOLVE input/output parameters/arrays
int work_size = 0;
int *devInfo; gpuErrchk(cudaMalloc(&devInfo, sizeof(int)));
// --- CUDA CHOLESKY initialization
cusolveSafeCall(cusolverDnDpotrf_bufferSize(solver_handle, CUBLAS_FILL_MODE_LOWER, N, d_A, N, &work_size));
// --- CUDA POTRF execution
double *work; gpuErrchk(cudaMalloc(&work, work_size * sizeof(double)));
cusolveSafeCall(cusolverDnDpotrf(solver_handle, CUBLAS_FILL_MODE_LOWER, N, d_A, N, work, work_size, devInfo));
int devInfo_h = 0; gpuErrchk(cudaMemcpy(&devInfo_h, devInfo, sizeof(int), cudaMemcpyDeviceToHost));
if (devInfo_h != 0) std::cout << "Unsuccessful potrf execution\n\n" << "devInfo = " << devInfo_h << "\n\n";
// --- At this point, the lower triangular part of A contains the elements of L.
/***************************************/
/* CHECKING THE CHOLESKY DECOMPOSITION */
/***************************************/
saveCPUrealtxt(h_A, "D:\\Project\\solveSquareLinearSystemCholeskyCUDA\\solveSquareLinearSystemCholeskyCUDA\\h_A.txt", N * N);
saveGPUrealtxt(d_A, "D:\\Project\\solveSquareLinearSystemCholeskyCUDA\\solveSquareLinearSystemCholeskyCUDA\\d_A.txt", N * N);
cusolveSafeCall(cusolverDnDestroy(solver_handle));
return 0;
}
编辑
Cholesky 分解要求相关矩阵是 Hermitian 且正定的。 How to generate random symmetric positive definite matrices using MATLAB? 中的方法可以生成对称矩阵和正定矩阵。 .
以下Matlab代码可用于检查结果
clear all
close all
clc
warning off
N = 1000;
% --- Setting the problem solution
x = ones(N, 1);
load h_A.txt
A = reshape(h_A, N, N);
yMatlab = A * x;
Lmatlab = chol(A, 'lower');
xprime = inv(Lmatlab) * yMatlab;
xMatlab = inv(Lmatlab') * xprime;
fprintf('Percentage rms of solution in Matlab %f\n', 100 * sqrt(sum(sum(abs(xMatlab - x).^2)) / sum(sum(abs(x).^2))));
load d_A.txt
LCUDA = tril(reshape(d_A, N, N));
fprintf('Percentage rms of Cholesky decompositions in Matlab and CUDA %f\n', 100 * sqrt(sum(sum(abs(Lmatlab - LCUDA).^2)) / sum(sum(abs(Lmatlab).^2))));
load xCUDA.txt
fprintf('Percentage rms of solution in Matlab %f\n', 100 * sqrt(sum(sum(abs(xCUDA - x).^2)) / sum(sum(abs(x).^2))));
关于cuda - 使用 CUDA 进行 Cholesky 分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29196139/
我正在开发一种算法,可以求解 Ax= b,其中 A 和 b 已知。 有两种方法可以实现此目的:x= A-1 b 或使用 Cholesky。我知道矩阵始终是方正定矩阵,尽管 det(A) 可能为零。在极
我真的很想评估你们中是否有任何人可以指出我在 Cholesky 分解 方面最优化和计算速度最快的线性代数库。 到目前为止,我一直在使用 Apache Commons Math 库,但也许已经有更强大和
我对 c 相当陌生,想根据维基百科的伪代码实现 cholesky 分解。需要动态分配内存。 我用以下示例矩阵尝试了我的代码: 4.000 2.000 0.000 0.000 2.000 5
double *cholesky(double *A, int n) { double *L = (double*)calloc(n * n, sizeof(double)); if
我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩
我正尝试在 C++ 中实现 Cholesky 分解,它以前在 lapack dpotrf_ 中实现过. Cholesky 分解:R' * R = A 代码: #include #include l
我正在使用 python 的 scikits.sparse.cholmod 来获取对称矩阵的 cholesky 分解。 我将 cholesky() 的结果与 matlab 的 chol() 进行了比较
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我使用 OpenCL 实现了以下 Cholesky 分解算法。该代码表现出随机行为。它仅在某些时候匹配 cpu 输出。有人可以帮我弄清楚我的实现有什么问题吗。 算法如下: procedure CHOL
我对大型稀疏矩阵的 Cholesky 分解很感兴趣。我遇到的问题是 Cholesky 因子不一定是稀疏的(就像两个稀疏矩阵的乘积不一定是稀疏的一样)。 例如,对于仅沿第一行、第一列和对角线具有非零值的
我正在尝试通过 pdpotrf() 进行 Cholesky 分解MKL-Intel 的库,它使用 ScaLAPACK。我正在读取主节点中的整个矩阵,然后像在这个 example 中一样分发它.当 SP
Cholesky Decomposition 有两种不同的形式: A = M * ctranspose (M) 和 LDL 形式 A = L * D * ctranspose (L) 其中 ctran
我想用 Sympy 找到一个符号 Cholesky 分解。矩阵 M(参见示例)是实对称的(因此是埃尔米特矩阵)。但 Sympy 引发 ValueError:矩阵必须是厄米特矩阵。 两个问题: 为什么会
我想使用 Eigen 来计算稀疏矩阵的 cholesky 分解。但是,结果不正确,我找不到原因。我如何获得正确答案? Eigen 中是否实现了特殊例程,利用稀疏矩阵的结构来提高性能(例如,对于下例中的
OpenCV 中是否有任何函数可用于对矩阵应用 Cholesky 分解? 最佳答案 如果仍然相关,OCV 3.0.0 直接通过 HAL 接口(interface)支持 Cholesky。参见 cv::
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow
我想获得 tf.cholesky 相对于其输入的梯度。目前,tf.cholesky 没有注册梯度: LookupError: No gradient defined for operation 'Ch
我想知道是否有人可以帮助我调试以下应该计算正定矩阵的上三角 cholesky 分解的 OCaml 代码。 我知道它不是很实用而且很笨重,所以我提前道歉。我在下面给出了一些原因。 不管怎样,这就过去了!
我正在尝试在 Halide 中实现 Cholesky 分解。部分常见算法(例如 crout)由对三角矩阵的迭代组成。在某种程度上,分解的对角线元素是通过从输入矩阵的对角线元素中减去部分列和来计算的。列
谁能给我指出一个库/代码,让我可以在 python (numpy) 中对 Cholesky 分解执行低阶更新?Matlab 将此功能作为称为“cholupdate”的函数提供。LINPACK 也有这个
我是一名优秀的程序员,十分优秀!