首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在CUDA内核中使用特征

如何在CUDA内核中使用特征
EN

Stack Overflow用户
提问于 2014-05-22 09:00:11
回答 4查看 22.9K关注 0票数 22

特征是c++线性代数库http://eigen.tuxfamily.org

使用基本数据类型(如基本浮点数数组)很容易,只需将其复制到设备内存并将指针传递到cuda内核即可。但是特征矩阵是复杂的类型,那么如何将其复制到设备内存中,并让库达内核与之一起读写呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-22 10:55:58

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

代码语言:javascript
运行
复制
MatrixXd A(10,10);
double *A_data = A.data();
票数 11
EN

Stack Overflow用户

发布于 2016-12-13 12:19:15

自2016年11月以来(发布了特征3.3版),存在一个新的选项:直接在CUDA内核内部使用特征--参见这个问题

链接问题中的示例:

代码语言:javascript
运行
复制
__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;
}

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

代码语言:javascript
运行
复制
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)
票数 26
EN

Stack Overflow用户

发布于 2014-05-22 09:34:50

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

我不能担保它,但如果它有效,它可能正是你想要的。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23802209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档