问题标签 [cusolver]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - 求解 AX=B 的线性方程
我目前求解 Ax=b 方程两次。
其中 A 是稀疏矩阵 NxN
x, b 是大小为 N 的向量。(我有 b1 和 b2)
我想通过使用 cusparse 函数一次性解决这两个问题来减少时间。
所以我想从我拥有的 2 个 b 构建一个大小为 Nx2 的矩阵,并用 A 求解它,就像方程 AX=B 可以做的那样。
- 理论上是对的吗?
- 我应该使用哪个 cusparse 函数?
请注意我正在使用稀疏矩阵而不是密集矩阵。
谢谢!
linear-algebra - 矩形矩阵的 Lapack 正交归一化函数
我想知道 Lapack 中是否有一个函数可以对一个非常高而瘦的矩阵的列进行正交归一化。一个类似的先前问题问了这个问题,大概是在方阵的上下文中。我的设置如下:我有一个 M 乘 N 矩阵 A,我正在尝试对其列进行正交归一化。
所以,我的第一个想法是做一个二维码分解。在 Lapack 中进行 qr 分解的函数似乎是 dgeqrf 和 dormqr。伟大的。但是,我的问题如下:我的矩阵 A 太高了,我不想实际计算所有 Q,因为它是 M × M。事实上,我无法实例化 M × M 矩阵在我的任何计算过程中(它不适合内存)。我宁愿只计算维基百科调用的矩阵 Q1。但是,我似乎无法找到一种方法来完成这项工作。
奇怪的是,我认为这是可能的。特别是 Numpy,有一个函数numpy.linalg.qr似乎就是这样做的。但是,即使在阅读了他们的源代码之后,我也无法弄清楚他们是如何使用 lapack 调用来使其工作的。
人们有想法吗?我强烈希望它只使用 lapack 函数,因为我希望将此代码移植到 CuSOLVE,它已经为 GPU 实现了几个 lapack 函数(包括 dgeqrf 和 dormqr)。
gpu - 为 cuSolverSp 例程处理具有大动态范围的矩阵的特殊方法?
我有类似这个链接的矩阵:
https://www.dropbox.com/s/tte3rlfsrprgtt8/ExampleMatrix.txt?dl=0
此示例是一个 9x9 稀疏矩阵,其中元素的值在大小上存在显着差异。例如,最小元素的大小为 7.130249e-17,最大元素的大小为 1.944061e-07。
该矩阵是我需要求解的一组线性方程 Ax=b 中的 A 矩阵。在我的应用程序中 A 是 cuDoubleComplex 类型。
目前,我使用 magma_zgesv_batched (一次计算多个(当前 25 个),每个批次的 A 和 B 不同)执行此操作,它通过部分旋转和行交换进行 LU 分解。这有效并提供了与我试图加速的原始代码的输出相匹配的正确输出。我有信心这行得通。
然而,在“现实生活”中,我需要解决的矩阵会更大,~2000*2000 并且 magma_zgesv_batched 存在问题,因为它被设计用于小矩阵。它非常慢,并且会警告使用本机版本。我所做的搜索表明人们已经使用 magma_zgesv_batched 达到了 1024*1024 的矩阵大小,但我自己还没有对此进行测试。
由于矩阵 A 是稀疏的(并且随着大小的增加将变得更加稀疏),我研究了使用 cuSovlerSp 例程,特别是 cusolverSpZcsrlsvluHost(具有部分旋转的传统 LU),因为它与 magma_zgesv_batched 最相似。
但是,这并没有像 magma_zgesv_batched 一样给出正确的结果。但同样,我有信心我已经用 csr 格式等正确地编码了问题。我已经测试了一个虚拟矩阵,其“正常”(1 阶)数字与上面的 9*9 矩阵位于相同的位置,并运行等效的 Matlab A \b 具有相同的(密集)虚拟 A 和 b 这确实为虚拟数据提供与 cusolverSpZcsrlsvluHost 相同的输出。所以我确信这是我在大动态范围问题中所拥有的特定数据的问题。
所以我的问题是问是否有其他人在使用具有大动态范围的矩阵元素之前遇到过这样的问题,如果是这样,如何处理它们?有没有可以应用于矩阵的技巧/缩放?
magma_zgesv_batched 和 cusolverSp 例程有什么区别?他们是否以不同的方式进行矩阵求逆等?
我是否应该坚持使用 magma_zgesv_batched 来减少尺寸问题,因为我知道这可行?
非常感谢任何建议!
谢谢
cuda - CuSolverRf 样本排序错误
我在使用CUolverRf 样本解决稀疏 196530 x 196530 和 2530239 nnz 矩阵时遇到问题。
我还没有尝试过使用 B 向量值(另一个问题)并且我已经有一个错误:
错误(列不定检查排序失败):(csrColInd 1 =2)>= (csrColInd[2]=2)
错误(未确定列排序检查失败):(csrColInd[3]=3) = (csrColInd[4]=3)
错误(排序不定列检查失败):(csrColInd[5]=2251)>=(csrColInd[6]=2251)
错误(对列 indecis 检查排序失败):(csrColInd[7]=2252) >= (csrColInd[8]=2252)
错误(排序不定列检查失败):(csrColInd[9]=4501)>=(csrColInd[10]=4501)
我试图隔离问题并根据我的分析将错误源缩小到对对称模式进行排序的“qsort.c”例程。
有人能告诉我我能做些什么来克服这个错误吗?
旁注:我可以以及如何稍后添加 B 值吗?谢谢你。
原始数据:
cuda - cuSolverRf 样本状态分配失败
使用示例文件运行CuSolverRf 示例,并允许程序顺利运行。但是,当我插入自己的文件时,在第 8 步之后出现错误:.mtx
lap2D_5pt_n100.mtx
lap3D_7pt_n20.mtx
.mtx
“cuSolverRF.ccp 处的 CUDA 错误:649 代码 = 2...”
我已将问题缩小到这里:
哪个会跳到
我的问题是“结果”是如何得出的?我能做些什么来克服这个问题或者我做错了什么?
附加信息:我的矩阵是 196530 x 196530 和 2530798 nnz。
matlab - 连接 cuSolver 与 MATLAB
我喜欢在 Matlab 中使用 cuSolver 代码对复杂矩阵进行特征值分解。
我正在使用 MATLAB CUDA 内核,似乎不可能将 cuSolver 与 MATLAB 接口,因为 cuSolver 包含主机和设备的代码(如此处所述:http: //docs.nvidia.com/cuda/cusolver/ #syevd-example1)而 MATLAB CUDA 内核仅适用于内核函数。请评论。
通过使用 Matlab 环境在 GPU 上并行计算包含复杂数据的大量矩阵的特征值分解的任何其他想法?
c++ - 链接到 CUDA 时未解析的外部符号
这是我的代码:
链接时出现以下错误:
我该如何解决这个问题?我必须添加 CUDA Linker 的东西??
我的环境:
- CUDA 7.5
- 视窗 64 位
- Visual Studio2013 社区
c++ - cuSolverDnDgetrf 的 cuSolver 示例不起作用
好的。我从 cuSolver 样本中获取的一些代码弄脏了我的手。我对 C++ 的经验很少,但我设法从原始代码中获取了我需要的东西。
问题是当我尝试执行它时;根据我编译的参考手册中的建议:
到这里为止没有问题;我得到的输出总是一样的:
无论我放置什么矩阵或 b 向量,结果都是一样的;代码无法分解矩阵。我已经展示了 INFO_VALUE ,其值在每次执行时始终为 2;它是info
cuSolverDnDgetrf() 函数请求的变量的值。在 cuSolver 参考手册中它说:
此函数计算 am×n 矩阵 P A = L U 的 LU 分解,其中 A 是 am×n 矩阵,P 是置换矩阵,L 是具有单位对角线的下三角矩阵,U 是上三角矩阵。如果 LU 分解失败,即矩阵 A(U) 是奇异矩阵,则输出参数 devInfo=i 表示 U(i,i) = 0。
在下面的代码中,我放置了相同的矩阵,所以没有奇异矩阵在运行。
这是整个代码;main() cuda 代码的模式是重复的:定义主机变量,将它们 cudaMemcpy 到设备,使用 cuda 函数在设备上执行它们,cudaMemcpy 将它们返回主机,然后继续使用串行代码,直到你重复。
就是这样。我知道这是很多东西;任何帮助,将不胜感激。我真的不明白我对这些矩阵做错了什么。
让我知道我是否应该添加一些其他相关信息。
NB 在原始代码中请求了一个扩展名为 .mtx 的外部稀疏矩阵,然后在 linearSolverLU 函数中将其转换为密集矩阵。我删除了那些东西,现在我直接尝试用密集矩阵来解决线性系统。
c++ - 在可执行文件中链接 CUDA 文件时出现 cuSparse 函数的多个定义错误
我的项目由五个 CUDA 文件组成:main.cu jacobian_kernel.cu hermite_kernel.cu cuSolver_LU.cpp Utilities.cu
,其中最后一个改编自这个 GitHub repo,连同它的Utilities.h
头文件;三个标题是args.h linear_solver.h Utilities.h
.
nvcc 成功编译它们,但是在构建trbdf2
可执行文件时,它对我大喊多个定义错误,例如:
现在,我很确定我多次helper_cusolver.h
包含 CUDA 工具包提供的头文件,它定义了函数vec_norminf
、mat_norminf
等。我猜不出如何重写我的标题,开头如下:
参数.h:
线性求解器.h:
实用程序.h:
此外,依赖项是:
此外,Utilities.cu
初始指令与其他 cuda 文件开头的指令有点不同,但它是我项目中最近添加的,在添加之前我遇到了同样的错误;无论如何,这里是:
长话短说,问题似乎是helper_cusolver.h
标题被多次包含,尽管我什至在linear_solver.h
标题的第一行中放置了一些标题保护;我已经尝试了#pragma once
受支持的指令,nvcc
我什至检查了helper_cusolver
.
我是 C/C++ 的初学者,我真的不知道如何从这里开始。我尝试#include
一次取消注释大多数(显然是多个)指令,但我一直收到相同的错误。
让我知道我是否应该包含其他信息。
编辑此外,当我用示例的 cudaCheckErrors 或 Utilities.cu 中的 GitHub 的 cusolveSafeCall 包装 CUDA 和/或 cuSolver 函数时,它们似乎没有被定义:
尽管标题 Utilities.h 已正确包含。我认为这可能是有用的信息,以便找到不正确的指令。
concurrency - 大量使用 cudaFree from cuSparse tridiagonal solver
我正在使用cusparseDgtsv_nopivot
函数来求解三对角方程组。输出是正确的,但该功能没有正确使用 cuda 多流。nvvp 分析器显示,尽管对该求解器的每次调用都在不同的流中,但它们永远不会重叠。我想到了隐式同步,并通过 nvvp 发现库函数在两者之间有很多对 cudaFree 的调用。有没有办法避免这种隐式同步?
使用cusparse的伪代码:
PS:提出了类似的 cudafree 问题并解决了处理矩阵:here。