特征是c++线性代数库http://eigen.tuxfamily.org。
使用基本数据类型(如基本浮点数数组)很容易,只需将其复制到设备内存并将指针传递到cuda内核即可。但是特征矩阵是复杂的类型,那么如何将其复制到设备内存中,并让库达内核与之一起读写呢?
发布于 2014-05-22 10:55:58
如果您只想通过一个原始C指针访问Eigen::Matrix的数据,那么您可以使用.data()函数。默认情况下,系数按列的主要顺序顺序存储在内存中,如果需要,则按行的顺序存储:
MatrixXd A(10,10);
double *A_data = A.data();发布于 2016-12-13 12:19:15
自2016年11月以来(发布了特征3.3版),存在一个新的选项:直接在CUDA内核内部使用特征--参见这个问题。
链接问题中的示例:
__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数组复制到设备:
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)发布于 2014-05-22 09:34:50
除了重写和修改代码外,还有一个与特征兼容的库,它是一个研究项目的副产品,在GPU上执行矩阵计算,您可以使用多个后端:https://github.com/rudaoshi/gpumatrix。
我不能担保它,但如果它有效,它可能正是你想要的。
如果您想要一个更通用的解决方案,这条线似乎包含了非常有用的信息。
https://stackoverflow.com/questions/23802209
复制相似问题