是否有任何库或免费提供的代码可以完全在GPU上计算小(6x6
)双精度矩阵的行列式?
答案 0 :(得分:3)
这是计划,您将需要缓冲100个这些微小矩阵并启动内核一次以计算所有这些矩阵的行列式。
我不打算编写实际代码,但这应该会有所帮助。
1)启动#blocks = #matrices。每个块计算每个矩阵的行列式。
2)det(A)= det(A11 * A22-A21 * A12);其中A是6x6,A11,A12,A21,A22是A的3x3子矩阵。
3)编写设备函数,对3x3矩阵进行矩阵乘法
4)3x3矩阵的det很容易计算:use the formula from here。
编辑:显然(2)仅在A21 * A12 == A12 * A21
时有效另一种选择是
每个6x6矩阵1)LU Decomposition by Gaussian elimination
2)将U的对角元素乘以得到行列式。
答案 1 :(得分:3)
正如Bart在上面的评论中已经特别指出的那样,使用GPU来计算小矩阵的行列式(甚至是其中许多矩阵的行列式)的计算并不能确保其他计算平台的收益。
我认为计算矩阵行列式的问题是 persé一个有趣的问题,可能会在应用程序中出现几次。目前,我不知道有任何库提供使用CUDA进行行列式计算的例程(cuBLAS
和cuSOLVER
都没有这样的例程),所以你有两种可能性:
关于最后一点,一种可能性是使用Cholesky decomposition,然后将行列式计算为Cholesky矩阵的对角元素乘积的平方。在Matlab中,它将显示为:
prod(diag(chol(A)))^2
下面,我提供了一个利用这个想法的代码。特别是,Cholesky分解是使用cuSOLVER
的{{1}}函数执行的,而Cholesky矩阵对角线元素的乘积是strided reduction with Thrust的应用。
下面的代码适用于大型矩阵,因此对于需要计算大型矩阵行列式的人来说,它会立即生效。但是如何使它适应几个小矩阵呢?一种可能性是使用potrf
的流进行Cholesky分解,然后使用Thurst 1.8的新动态并行性功能。请注意,从CUDA 7.0开始,cuSOLVER
不允许使用动态并行。
以下是代码:
cuSOLVER
答案 2 :(得分:-2)
您可以使用OpenCL或CUDA作为libary并编写一个简短的程序(OpenCL中的内核)来计算GPU上的行列式
CUDA http://www.nvidia.de/object/cuda_home_new_de.html
的OpenCL http://www.khronos.org/opencl/
http://www.csd.uwo.ca/~moreno/Publications/DetHpcsPaper-proceedings.pdf
本文应包含CUDA的伪代码