使用CUDA计算行列式

时间:2012-08-02 13:57:17

标签: cuda gpu linear-algebra gpgpu nvidia

是否有任何库或免费提供的代码可以完全在GPU上计算6x6)双精度矩阵的行列式?

3 个答案:

答案 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进行行列式计算的例程(cuBLAScuSOLVER都没有这样的例程),所以你有两种可能性:

  1. 如Pavan所指出的,实施自己的方法;
  2. 管理以使用其他可用的例程。
  3. 关于最后一点,一种可能性是使用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的伪代码