如何在CUDA内核中使用Eigen

Mic*_*ine 14 c++ cuda eigen

Eigen是一个c ++线性代数库http://eigen.tuxfamily.org.

使用基本数据类型(如基本浮点数组)很容易,只需将其复制到设备内存并将指针传递给cuda内核即可.但是Eigen矩阵是复杂的类型,那么如何将其复制到设备内存并让cuda内核用它进行读/写?

GPM*_*ler 14

自2016年11月(Eigen 3.3发布)以来,存在一个新选项:在CUDA内核中直接使用Eigen - 请参阅此问题.

链接问题的示例:

__global__ void cu_dot(Eigen::Vector3f *v1, Eigen::Vector3f *v2, double *out, size_t N)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if(idx < N)
    {
        out[idx] = v1[idx].dot(v2[idx]);
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

将数组复制Eigen::Vector3f到设备:

Eigen::Vector3f *host_vectors = new Eigen::Vector3f[N];
Eigen::Vector3f *dev_vectors;
cudaMalloc((void **)&dev_vectors, sizeof(Eigen::Vector3f)*N)
cudaMemcpy(dev_vectors, host_vectors, sizeof(Eigen::Vector3f)*N, cudaMemcpyHostToDevice)
Run Code Online (Sandbox Code Playgroud)


gga*_*ael 8

如果你想要的只是Eigen::Matrix通过原始C指针访问数据,那么你可以使用该.data()函数.默认情况下,系数按列主顺序依次存储在内存中,如果您要求,则系列存储为行数:

MatrixXd A(10,10);
double *A_data = A.data();
Run Code Online (Sandbox Code Playgroud)

  • @MickeyShine:请注意,这与您将 CUDA 与包含 POD 结构的 STL 向量一起使用时可以执行的操作类似。正如 ggael 所说,请注意默认存储顺序。 (2认同)

rub*_*nvb 5

除了重写和改写代码外,还有一个作为研究项目的副产品编写的 Eigen 兼容库,可以在 GPU 上执行矩阵计算,您可以使用多个后端:https : //github.com/rudaoshi/gpumatrix

我不能保证它,但如果它有效,它可能正是你正在寻找的。

如果你想要一个更通用的解决方案,这个线程似乎包含非常有用的信息