在cuda cusp线性求解器中使用内存

时间:2015-11-04 04:36:27

标签: memory cuda out-of-memory allocation cusp-library

我使用 cusp :: bicgstab 来求解线性系统 Ax = b ,其中 A 是MxNxP网格上的3D泊松, x 是未知数, b 是RHS。我有 K40m Tesla ,它有12GB内存。

我测试了 M = 2000,N = 2000,P = 20 (8,000万个未知数),变量类型 double ;所以使用的总内存(对于 A,x,b,等)约为 5.5GB 。代码工作正常。

然后我将M或N的值增加到2500(使用的内存仍然远小于12GB),程序遇到以下错误:

  

在抛出'thrust :: system :: detail :: bad_alloc'

的实例后终止调用      

what():std :: bad_alloc:内存不足
  中止(核心倾销)

我发现错误是“超出设备内存”。因此,我想知道 cusp 库中的内存管理。在解决系统的迭代过程中,它是否使用相同的内存空间来获取额外的变量(用于 A,x,b )?

以下是我的代码:

#include <iostream>
#include <cuda.h>
#include <cuda_runtime_api.h>

#include <cusp/monitor.h>
#include <cusp/krylov/bicgstab.h>
#include <cusp/gallery/poisson.h>
#include <cusp/print.h>

// where to perform the computation
typedef cusp::device_memory MemorySpace;

// which floating point type to use
typedef double ValueType;

int main(int argc, char **argv)
{
    size_t avail, total;                // Available and Total memory count
    int N = 2500, M = 2000, P = 20;     // Dimension

    // create a matrix for a 3D Poisson problem on a MxNxP grid
    cusp::dia_matrix<int, ValueType, MemorySpace> A;
    cusp::gallery::poisson7pt(A, N, M, P);

    // allocate storage for solution (x) and right hand side (b)
    cusp::array1d<ValueType, MemorySpace> x(N*M*P, 0.0);
    cusp::array1d<ValueType, MemorySpace> b(N*M*P, 1.0);

    // set preconditioner (identity)
    cusp::identity_operator<ValueType, MemorySpace> ID(A.num_rows, A.num_rows);

    // Set stopping criteria:
    // ... iteration_limit    = 100
    // ... relative_tolerance = 1e-9
    // ... absolute_tolerance = 0
    cusp::default_monitor <ValueType> monitor(b, 100, 1e-9);

    // solve the linear system A x = b
    cusp::krylov::bicgstab(A, x, b, monitor, ID);

    // Get device memory usage
    cudaMemGetInfo( &avail, &total );
    size_t used = total - avail;
    std::cout << "Device memory used: " << used/(1024.*1024.*1024.) << " Gb " << std::endl;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您可以自己阅读 ldapalias = 'ldap-matam' vault = node['was']['credentialsVault'] authalias = chef_vault_item(vault, ldapalias) username = authalias[node['was']['credentialsUsername']] password = authalias[node['was']['credentialsPassword']] wasbnhp_ldapconnection 'LDAP MAIN' do profile dmgrProfile baseDN 'dc=mydomain,dc=com' bindDN username binpwd password ldapServer 'LDAPPROD.mydomain.com' end 解算器的source,但看起来有八个临时数组,每个数组的条目数与矩阵中的行数相同。如果我已正确读取您的代码,这意味着您需要在bicgstab调用8 * N * M * P * sizeof(double)调用时需要至少bicgstab字节的可用GPU内存才能运行解算器。